О вреде hasattr() (hynek.me) 29 января 2016
Хинек Шлавак советует отказаться от использования функции hasattr
во втором питоне.
hasattr
считает любое исключение отсутствием атрибута:
>>> class C(object):
... @property
... def y(self):
... 0/0
...
>>> hasattr(C(), "y")
False
Из-за этого можно пропустить ошибку в коде свойства. Их можно заметить раньше, если писать так:
try:
print(x.y)
except AttributeError:
print("no y!")
Или так:
y = getattr(x, "y", None)
if y is not None:
print(y)
else:
print("no y!")
В третьем питоне при исполнении этого же кода hasattr
бросает ZeroDivisionError
. Тоже не совсем ожидаемо, но по крайней мере, ошибку сразу видно.