Они проверяют разные вещи. Один проверяет, чтобы убедиться, что доступ к request.rk_user
не удастся (hasattr
), а другой проверяет, что это не какой-то False
-подобный тип, скорее всего None
(последняя часть условного). Если бы он действительно хотел использовать защищенный стиль программирования, он мог бы сделать:
if hasattr(request, `rk_user`) and request.rk_user \
and hasattr(request.rk_user, 'focus_update') \
and callable(request.rk_user.focus_update):
request.rk_user.focus_update()
Но это просто глупо и обременительно, поэтому более питонский стиль - просто пытаться справиться с исключением. У него даже есть аббревиатура EAFP (Проще просить прощения, чем разрешения), и он в глоссарии Python .
Итак, ни один из вас не прав больше, чем другой. Если есть распространенные случаи, когда вы ожидаете, что request
не имеет этого атрибута, тогда проверьте его. Если бывают случаи, когда даже если он имеет этот атрибут, иногда это None
, тогда стоит проверить его. Но вы не собираетесь действительно охватывать все ваши базы или пути потенциальных исключений какими-либо условными условиями, поэтому проверяйте только то, что вы ожидаете разумно ожидать, и используйте логику для обработки.