In Python, ho spesso sentito che è meglio "chiedere perdono" (rilevazione delle eccezioni) invece di "chiedere l'autorizzazione" (controllo del tipo / condizione). Per quanto riguarda l'applicazione della tipizzazione anatra in Python, è questo
try:
x = foo.bar
except AttributeError:
pass
else:
do(x)
meglio o peggio di
if hasattr(foo, "bar"):
do(foo.bar)
else:
pass
in termini di prestazioni, leggibilità, "pythonic" o qualche altro fattore importante?
hasattr
è implementato con quel preciso tentativo / cattura internamente. Non sono sicuro che sia vero ... ( getattr
hasattr
usa l'equivalente C-API di getattr
(return in True
caso di successo, in False
caso contrario), ma la gestione delle eccezioni in C è molto più veloce.