Existe-t-il un moyen en Python de déterminer si un objet possède un certain attribut ? Par exemple :
>>> 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'
Comment savoir si a
possède l'attribut property
avant de l'utiliser ?
Essayez [hasattr()
][1] :
if hasattr(a, 'property'):
a.property
EDIT : Voir la réponse de zweiterlinde ci-dessous, qui donne de bons conseils pour demander pardon ! Une approche très pythique !
La pratique générale en python est que, si la propriété est susceptible d'être là la plupart du temps, il suffit de l'appeler et soit de laisser l'exception se propager, soit de la piéger avec un bloc try/except. Cela sera probablement plus rapide que hasattr
. Si la propriété est susceptible de ne pas être là la plupart du temps, ou si vous n'êtes pas sûr, utiliser hasattr
sera probablement plus rapide que de tomber de façon répétée dans un bloc d'exception.
[1] : https://docs.python.org/3/library/functions.html#hasattr
Je pense que ce que vous recherchez est hasattr. Cependant, je recommanderais quelque chose comme ceci si vous voulez détecter les propriétés de Python-.
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
L'inconvénient ici est que les erreurs d'attribut dans le code __get__
des propriétés sont également capturées.
Sinon, faites...
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
Selon pydoc, hasattr(obj, prop) appelle simplement getattr(obj, prop) et attrape les exceptions. Ainsi, il est tout aussi valable d'envelopper l'accès à l'attribut avec une instruction try et de capturer AttributeError que d'utiliser hasattr() au préalable.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value