Python -1
Nach langer abstinenz (immer nur Kleinkram) habe ich gestern mal wieder ernsthaft an neuen Funktionen für pyChao gearbeitet (übrigens einer Suchfunktion für rss-Feeds). Dabei ist mir eine wirklich sehr unschöne Eigenschaft von Python aufgefallen.
Bei Verwendung als Boolean-Wert wird Int -1 zu True aufgelöst. Ohne jetzt groß zu überlegen klingt das ziemlich egal bis harmlos.
Blöd wird es jedoch bei Funktionen wie find(). Beispiel:
if text.find(textschnipsel):
Was macht dieser Code? Er sucht ob der String Textschnipsel im String Text vorkommt. Wenn der Text vorkommt gibt find aber keinen Boolean zurück, sondern die erste Stelle an der der Textschnipsel gefunden wird. Das kann ein Integer von 0 bis len(text)-1 sein.
Was wenn keine Stelle gefunden wird? Dann wird -1 zurückgeliefert. Der Autor der Funktion kann ja nichtmal was dafür... Was sollte er auch sonst tun? 0 zurückliefern geht ja nicht, das würde bedeuten dass Text gleich am Anfang Textschnipsel stehen hat.
Der genannte Code evaluiert also IMMER zu True, egal welcher Text eingegeben wird. Imho ist dies ein Designfehler der Sprache. Man könnte auf derartige Situationen unterschiedlich reagieren... -1 könnte False ergeben (und mir fällt kein Grund ein warum <=0 nicht immer False sein sollte), alternativ könnte man generell Exceptions werfen wenn negative Zahlen als Bool verwendet werden. Jede Möglichkeit wäre besser. Auf keinen Fall sollte man auf ein derartiges Verhalten zurückgreifen wie es jetzt getan wird. Es sei denn man will Sprachneulinge bewusst verwirren.
Die Lösung für das Problem ist natürlich einfach... man muss halt nur das Problem finden:
if text.find(textschnipsel)!=-1:
Importierte/Alte Kommentare:
#842: 26.Oct.2008 01:10 von profmakx
Explicit is better than implicit. (Weniger kaputte Sprachen wie Haskell kotzen einem beim kompilieren schon auf den Tisch, weil man Integer nicht mit Booleans vergleichen kann)
#843: 26.Oct.2008 01:10 von Dr. Azrael Tod
wie gesagt... exception werfen wäre besser.
Das ist ja auch die Stelle die mich an PHP/HTML/Javascript und Konsorten so ankotzt.. egal was man tut es gibt nie nen kritischen Fehler, teilweise werden selbst Fehlende Funktionen oder wahlloser Text im Kot hingenommen (php: print_r(Das ist keine Konstante und auch kein String))