2396 votes

A quoi reconnaître que votre enfant fait usage de parmesan.

Est-il possible en Python pour déterminer si un objet possède un attribut ? Par exemple :

Comment pouvez-vous dire si possède l’attribut avant de l’utiliser ?

3362voto

Jarret Hardie Points 36266

Essayez hasattr():

if hasattr(a, 'property'):
    a.property

EDIT: Voir zweiterlinde la réponse ci-dessous, qui offre de bons conseils sur le point de demander pardon! Un très pythonic approche!

La pratique générale en python, c'est que, si le bien est susceptible d'être là la plupart du temps, il suffit de l'appeler et de laisser l'exception de se propager, ou un piège avec un try/except bloc. Ce sera probablement plus rapide que l' hasattr. Si la propriété est susceptible de ne pas être là la plupart du temps, ou vous n'êtes pas sûr, à l'aide de hasattr sera probablement plus rapide qu'à plusieurs reprises de tomber dans un bloc d'exception.

818voto

zweiterlinde Points 5984

Comme Jarret Hardie répondu, hasattr fera l'affaire. Je voudrais ajouter, cependant, que beaucoup dans la communauté Python de recommander une stratégie de "plus facile de demander pardon que la permission" (l'aeap) plutôt que de "réfléchir avant d'agir" (LBYL). Voir ces références:

L'aeap vs LBYL (était Re: Un peu déçu à ce jour)
L'aeap vs LBYL @Code Comme un Pythonista: Idiomatiques Python

c'est à dire:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

... est préféré à:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

657voto

Carl Meyer Points 30736

Vous pouvez utiliser hasattr() ou attraper AttributeError, mais si vous voulez juste la valeur de l'attribut avec une valeur par défaut si elle n'est pas là, la meilleure option est d'utiliser getattr():

getattr(a, 'property', 'default value')

55voto

batbrat Points 3481

Je pense que ce que vous cherchez est hasattr. Cependant, je vous recommande de quelque chose de ce genre si vous voulez détecter python propriétés-

try:
    getattr(someObject, 'someProperty')         
except AttributeError:
    print "Doesn't exist"
else
    print "Exists"

L'inconvénient ici est que les erreurs d'attribut dans les propriétés __get__ code sont également capturés.

Sinon, faites-le

if hasattr(someObject, 'someProp'):
    #Access someProp/ set someProp
    pass

Docs:http://docs.python.org/library/functions.html
Avertissement:
La raison de ma recommandation est que hasattr ne détecte pas les propriétés.
Lien:http://mail.python.org/pipermail/python-dev/2005-December/058498.html

40voto

Jordan Lewis Points 3456

Selon pydoc, hasattr(obj, prop) appelle simplement getattr(obj, prop) et de captures d'exceptions. Donc, il est tout aussi valable pour envelopper l'attribut de l'accès à une instruction try et catch AttributeError comme il est d'usage hasattr() à l'avance.

a = SomeClass()
try:
    return a.fake_prop
except AttributeError:
    return default_value

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X