C'è un modo in Python per determinare se un oggetto ha qualche attributo? Per esempio:
>>> 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'
Come si può dire se a
ha l'attributo property
prima di usarlo?
Prova hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Vedi zweiterlinde'risposta qui sotto, che offre un buon consiglio sul chiedere perdono! Un approccio molto pitonico!
La pratica generale in python è che, se è probabile che la proprietà sia lì per la maggior parte del tempo, basta chiamarla e lasciare che l'eccezione si propaghi, o intrappolarla con un blocco try/except. Questo sarà probabilmente più veloce di hasattr
. Se è probabile che la proprietà non sia presente per la maggior parte del tempo, o non siete sicuri, usare hasattr
sarà probabilmente più veloce che cadere ripetutamente in un blocco di eccezioni.
Penso che quello che stai cercando sia hasattr. Tuttavia, ti consiglierei qualcosa del genere se vuoi rilevare le proprietàpython-.
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Lo svantaggio qui è che vengono catturati anche gli errori di attributo nel codice __get__
delle proprietà.
Altrimenti, do-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Docs:http://docs.python.org/library/functions.html
Attenzione:
La ragione della mia raccomandazione è che hasattr non rileva le proprietà.
Link:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
Secondo pydoc, hasattr(obj, prop) chiama semplicemente getattr(obj, prop) e cattura le eccezioni. Quindi, è altrettanto valido avvolgere l'accesso all'attributo con una dichiarazione try e catturare AttributeError quanto usare hasattr() prima.
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value