В 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 происходит намного быстрее.