Υπάρχει τρόπος στην Python να προσδιορίσετε αν ένα αντικείμενο έχει κάποιο χαρακτηριστικό; Για παράδειγμα:
>>> 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'
Πώς μπορείτε να διαπιστώσετε αν το a
έχει το χαρακτηριστικό property
πριν το χρησιμοποιήσετε;
Δοκιμάστε hasattr()
:
if hasattr(a, 'property'):
a.property
EDIT: Δείτε την απάντηση του zweiterlinde's παρακάτω, ο οποίος προσφέρει καλές συμβουλές σχετικά με το να ζητάτε συγχώρεση! Μια πολύ πυθωνική προσέγγιση!
Η γενική πρακτική στην python είναι ότι, αν η ιδιότητα είναι πιθανό να υπάρχει τις περισσότερες φορές, απλά την καλείτε και είτε αφήνετε την εξαίρεση να διαδοθεί, είτε την παγιδεύετε με ένα μπλοκ try/except. Αυτό θα είναι πιθανότατα ταχύτερο από το hasattr
. Αν η ιδιότητα είναι πιθανό να μην υπάρχει τις περισσότερες φορές, ή δεν είστε σίγουροι, η χρήση του hasattr
θα είναι πιθανώς ταχύτερη από το να πέσετε επανειλημμένα σε ένα μπλοκ εξαιρέσεων.
Νομίζω ότι αυτό που ψάχνετε είναι hasattr. Ωστόσο, θα συνιστούσα κάτι τέτοιο αν θέλετε να ανιχνεύσετε ιδιότητες της Python-
try:
getattr(someObject, 'someProperty')
except AttributeError:
print "Doesn't exist"
else
print "Exists"
Το μειονέκτημα εδώ είναι ότι συλλαμβάνονται και τα λάθη των ιδιοτήτων στον κώδικα των ιδιοτήτων __get__
.
Διαφορετικά, do-
if hasattr(someObject, 'someProp'):
#Access someProp/ set someProp
pass
Docs:http://docs.python.org/library/functions.html
Προειδοποίηση:
Ο λόγος για τη σύστασή μου είναι ότι το hasattr δεν ανιχνεύει ιδιότητες.
Σύνδεσμος:http://mail.python.org/pipermail/python-dev/2005-December/058498.html
Σύμφωνα με το pydoc, η hasattr(obj, prop) απλά καλεί την getattr(obj, prop) και πιάνει τις εξαιρέσεις. Έτσι, είναι εξίσου έγκυρο να τυλίξετε την πρόσβαση στο χαρακτηριστικό με μια δήλωση try και να πιάσετε το AttributeError, όπως και να χρησιμοποιήσετε προηγουμένως την hasattr().
a = SomeClass()
try:
return a.fake_prop
except AttributeError:
return default_value