Die python2 Implementierung von hasattr ziemlich naiv ist, es versucht, nur das Attribut zugreifen und sehen, ob es eine Ausnahme oder nicht erhöht.
Leider bedeutet dies, dass alle nicht behandelten Ausnahmen in den Eigenschaften verschluckt werden und Fehler in diesem Code verloren gehen können. Um eine Verletzung hinzuzufügen, wenn hasattr die Ausnahme isst, gibt es auch eine falsche Antwort zurück (hier existiert das Attribut a.foo
existiert, so sollte das Ergebnis True
wenn überhaupt zurückgegeben haben).
In python3.2 +, hat sich das Verhalten korrigiert:
hasattr(object, name)
Die Argumente sind ein Objekt und eine Zeichenfolge. Das Ergebnis ist True
, wenn die Zeichenfolge der Name eines der Attribute des Objekts ist, False
wenn nicht. (Dies wird durch getattr(object, name)
Aufruf implementiert und zu sehen, ob es ein AttributeError
oder nicht erhöht.)
Das Update ist here, aber leider, dass Veränderungen zurückzuportieren nicht.
Wenn das Python2-Verhalten Probleme für Sie verursacht, sollten Sie die Verwendung von hasattr
vermeiden; Stattdessen können Sie einen Versuch/Ausnahme um getattr
verwenden, nur die AttributeError
Ausnahme abfangen und alle anderen unbehandelt erhöhen lassen.
Das Zitat aus der Python-Dokumentation trotz, 'hasattr'-Verhalten kann immer noch als seltsam angesehen werden. Es ist wahr, dass willkürliche Ausnahmen innerhalb einer Eigenschaft nicht mehr dazu führen, dass das Attribut als abwesend angesehen wird (sondern direkt im Gesicht des Aufrufenden ausgelöst wird), aber wenn ein Attributfehler von irgendwo innerhalb der Eigenschaft stammt, wird das Ergebnis von hasattr weiterhin angezeigt sei 'falsch'. Dies ist möglicherweise nicht beabsichtigt. (Oder, so kann eine Eigenschaft selbst bestimmen, ob sie "da" sein will.) In jedem Fall klingt die Ausführung der Eigenschaft in erster Linie falsch, unter Berücksichtigung von Nebenwirkungen usw. –
Es gibt nicht wirklich einen direkten Weg um zu bestimmen, ob ein "AttributeError" durch die Attribut-erhaltende Maschine selbst oder durch den Code in einer Eigenschaft ausgelöst wurde. – kindall