W Pythonie często słyszę, że lepiej „błagać o wybaczenie” (wyłapywanie wyjątków) zamiast „pytać o pozwolenie” (sprawdzanie typu / warunku). Jeśli chodzi o wymuszanie pisania kaczek w Pythonie, to jest to
try:
x = foo.bar
except AttributeError:
pass
else:
do(x)
lepszy czy gorszy niż
if hasattr(foo, "bar"):
do(foo.bar)
else:
pass
pod względem wydajności, czytelności, „python” lub innego ważnego czynnika?
hasattr
jest realizowane wewnętrznie z tą dokładną próbą. Nie jestem pewien, czy to prawda ... (działałoby inaczej na nieruchomościach, prawda? Może myślę o getattr
...)
hasattr
używa C-API równoważnego getattr
(zwróć, True
jeśli się powiedzie, False
jeśli nie), ale obsługa wyjątków w C jest znacznie szybsza.