Gibt es in Python eine Möglichkeit, festzustellen, ob ein Objekt ein Attribut hat? Zum Beispiel:
>>> a = SomeClass()
>>> a.someProperty = value
>>> a.property
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: SomeClass instance has no attribute 'property'
Wie können Sie feststellen, ob a
das Attribut vorhanden ist, property
bevor Sie es verwenden?
quelle
import string hasattr(string, "lower")
hasattr
ist genau das gleiche wie die Verwendung vontry
/except AttributeError
: Die Dokumentzeichenfolge von hasattr (in Python 2.7) besagt, dass getattr verwendet wird. Hand fängt Ausnahmen ab.hasattr
ist leider nicht genau das gleiche wietry: ... except AttributeError:
in Python 2.x, da alle Ausnahmen abgefangenhasattr
werden . In meiner Antwort finden Sie ein Beispiel und eine einfache Problemumgehung.Wie Jarret Hardie antwortete,
hasattr
wird er den Trick machen. Ich möchte jedoch hinzufügen, dass viele in der Python-Community eine Strategie empfehlen, bei der es einfacher ist, um Vergebung zu bitten als um Erlaubnis (EAFP), anstatt "schauen, bevor Sie springen" (LBYL). Siehe diese Referenzen:EAFP gegen LBYL (war Re: Bisher ein wenig enttäuscht)
EAFP gegen LBYL @Code Wie ein Pythonista: Idiomatisches Python
dh:
... wird bevorzugt gegenüber:
quelle
try:
sollte, ist der versuchte Attributzugriff. Es gibt keinen Grund, die Ausführung ebenfalls zu beendendoStuff
. Es besteht jedoch immer noch ein gewisses Potenzial für Mehrdeutigkeiten: Wennproperty
es sich um eine berechnete Eigenschaft anstelle eines einfachen Attributs handelt, kann sich die ImplementierungAttributeError
intern erhöhen . Aus diesem Grund ist es in fast allen realen Situationen wie diesengetattr
entweder vorzuziehenhasattr
oder zu fangenAttributeError
.Sie können verwenden
hasattr()
oder abfangenAttributeError
, aber wenn Sie wirklich nur den Wert des Attributs mit einem Standardwert möchten, wenn er nicht vorhanden ist, ist die beste Option, einfach Folgendes zu verwendengetattr()
:quelle
Ich denke, was Sie suchen, ist hasattr . Ich würde jedoch so etwas empfehlen, wenn Sie Python-Eigenschaften erkennen möchten -
Der Nachteil hierbei ist, dass auch Attributfehler im Eigenschaftencode
__get__
abgefangen werden.Andernfalls tun Sie
Docs: http://docs.python.org/library/functions.html
Warnung:
Der Grund für meine Empfehlung ist, dass hasattr keine Eigenschaften erkennt.
Link: http://mail.python.org/pipermail/python-dev/2005-December/058498.html
quelle
hasattr
erkennt Eigenschaften im Allgemeinen gut. Es ist nur so, dass dasproperty
Auslösen einer Ausnahme in der Funktion -wrapped so behandelt wird, dass kein solches Attribut vorhanden ist. Der verknüpfte Python-Mailinglistenbeitrag handelt von einer Eigenschaft, die eine Ausnahme auslöst, wenn Sie versuchen, darauf zuzugreifen. Für alle praktischen Zwecke existiert dieses Attribut nicht, da es niemals einen Wert erzeugen wird.hasattr
Unterdrückt außerdem nur Ausnahmen im Allgemeinen in Py 3.1 und früheren Versionen. in 3.2+ wird nur unterdrückt (durchFalse
return ersetzt)AttributeError
.Laut pydoc ruft hasattr (obj, prop) einfach getattr (obj, prop) auf und fängt Ausnahmen ab. Es ist also genauso gültig, den Attributzugriff mit einer try-Anweisung zu versehen und AttributeError abzufangen, wie zuvor hasattr () zu verwenden.
quelle
hasattr
bei denSomeClass
Überschreibungen__getattr__
seithasattr
werden fangen alle Ausnahmen in Python 2.x, nicht nurAttributeError
wie man erwarten würde. Dies wurde in Python 3.2 behoben. Eine einfache Problemumgehung finden Sie in meiner anderen Antwort .Ich möchte vorschlagen, dies zu vermeiden:
Der Benutzer @jpalecek erwähnte es: Wenn ein
AttributeError
drinnen auftrittdoStuff()
, sind Sie verloren.Vielleicht ist dieser Ansatz besser:
quelle
Je nach Situation können Sie überprüfen,
isinstance
welche Art von Objekt Sie haben, und dann die entsprechenden Attribute verwenden. Mit der Einführung abstrakter Basisklassen in Python 2.6 / 3.0 ist dieser Ansatz auch viel leistungsfähiger geworden (ABCs ermöglichen im Grunde eine ausgefeiltere Art der Ententypisierung).Eine Situation, in der dies nützlich ist, wäre, wenn zwei verschiedene Objekte ein Attribut mit demselben Namen, aber unterschiedlicher Bedeutung haben. Nur
hasattr
die Verwendung kann dann zu seltsamen Fehlern führen.Ein schönes Beispiel ist die Unterscheidung zwischen Iteratoren und Iterablen (siehe diese Frage). Die
__iter__
Methoden in einem Iterator und einem Iterator haben den gleichen Namen, sind aber semantisch sehr unterschiedlich! Isthasattr
also nutzlos,isinstance
bietet aber zusammen mit ABC eine saubere Lösung.Ich stimme jedoch zu, dass in den meisten Situationen der
hasattr
Ansatz (in anderen Antworten beschrieben) die am besten geeignete Lösung ist.quelle
Ich hoffe, Sie erwarten hasattr (), aber versuchen Sie, hasattr () zu vermeiden, und bevorzugen Sie bitte getattr (). getattr () ist schneller als hasattr ()
mit hasattr ():
das gleiche hier verwende ich getattr, um Eigenschaft zu erhalten, wenn es keine Eigenschaft gibt, gibt es keine zurück
quelle
EDIT : Dieser Ansatz hat ernsthafte Einschränkungen. Es sollte funktionieren, wenn das Objekt iterierbar ist . Bitte überprüfen Sie die Kommentare unten.
Wenn Sie Python 3.6 oder höher wie ich verwenden, gibt es eine bequeme Alternative, um zu überprüfen, ob ein Objekt ein bestimmtes Attribut hat:
Ich bin mir jedoch nicht sicher, welcher Ansatz derzeit der beste ist. Verwenden
hasattr()
, Verwendengetattr()
oder Verwendenin
. Kommentare sind willkommen.quelle
in
Das Schlüsselwort dient zum Überprüfen iterierbarer Typen. Zum Beispiel'foo' in None
löst der Fehler ausTypeError: argument of type 'NoneType' is not iterable
. Das Update besteht darin, vor der Verwendung zu überprüfen, ob der Typ iterierbar istin
. Nachdem Sie Kantenfälle wie nicht iterierbare Typen korrigiert haben, ist es wahrscheinlich besser, sie zu verwenden,hasattr()
da sie für die Behandlung von Randfällen ausgelegt sind.dict
als "leichtgewichtiges Objekt" verwenden, ähnlich wie beim Entwurf von JavaScript-Objekten. Die meisten normalen Klassen unterstützen dies jedoch im Allgemeinen nicht (eine Variante des von @SethDifley erwähnten Fehlers wird abgerufen). .Hier ist ein sehr intuitiver Ansatz:
quelle
Dies ist sehr einfach. Verwenden Sie einfach das
dir(
Objekt.)
Dies gibt eine Liste aller verfügbaren Funktionen und Attribute des Objekts zurück.
quelle
Eine andere mögliche Option, aber es hängt davon ab, was Sie vorher damit meinen :
Ausgabe:
Auf diese Weise können Sie sogar nach Attributen ohne Wert suchen.
Aber! Seien Sie sehr vorsichtig, dass Sie nicht versehentlich
undefined
mehrere Orte instanziieren und vergleichen, da diesis
in diesem Fall niemals funktioniert.Aktualisieren:
Aufgrund dessen, worüber ich im obigen Absatz gewarnt habe, da mehrere undefinierte Werte nie übereinstimmen, habe ich dieses Muster kürzlich geringfügig geändert:
undefined = NotImplemented
NotImplemented
, nicht zu verwechselnNotImplementedError
, ist ein integriertes Element: Es entspricht halb der Absicht eines JS,undefined
und Sie können seine Definition überall wiederverwenden, und es stimmt immer überein. Die Nachteile sind, dass es in Booleschen Werten "wahr" ist und in Protokollen und Stapelspuren seltsam aussehen kann (aber Sie kommen schnell darüber hinweg, wenn Sie wissen, dass es nur in diesem Kontext erscheint).quelle
Sie können
object
mithilfe derhasattr
integrierten Methode überprüfen, ob Attribute enthalten sind.Für eine Instanz, wenn Ihr Objekt ist
a
und Sie nach Attributen suchen möchtenstuff
Die Methodensignatur selbst
hasattr(object, name) -> bool
bedeutet, dassobject
das Attribut, das an das zweite Argument übergebenhasattr
wird, boolesch istTrue
oderFalse
dem Vorhandensein einesname
Attributs im Objekt entspricht.quelle
hasattr()
ist die richtige Antwort. Was ich hinzufügen möchte, ist, dasshasattr()
es auch gut in Verbindung mit assert verwendet werden kann (um unnötigeif
Anweisungen zu vermeiden und den Code lesbarer zu machen):Wie in einer anderen Antwort zu SO angegeben : Asserts sollten verwendet werden, um Bedingungen zu testen, die niemals eintreten sollten. Der Zweck besteht darin, bei einem beschädigten Programmstatus frühzeitig abzustürzen.
quelle
hasattr
nicht der umgebende Code verwendet wird.