У Python я часто чую, що краще "просити прощення" (вилучення винятків), а не "запитувати дозвіл" (перевірка типу / умови). Що стосується примусового набору качок в Python, це так
try:
x = foo.bar
except AttributeError:
pass
else:
do(x)
краще чи гірше, ніж
if hasattr(foo, "bar"):
do(foo.bar)
else:
pass
з точки зору продуктивності, читабельності, "пітонічності" чи якогось іншого важливого чинника?
hasattr
реалізується саме з такою точною спробою / ловом. Не впевнений, чи це правда ... (це діятиме по-іншому щодо властивостей, чи не так? Можливо, я думаю про це getattr
).
hasattr
використовує еквівалент C-API getattr
(повертається, True
якщо це успішно, False
якщо ні), але обробка винятків у C набагато швидша.