Это необходимо для всех этих проверок в коде моего босса django? - PullRequest
0 голосов
/ 10 марта 2011

Это код моего босса:

if hasattr(request, 'rk_user') and request.rk_user:
            request.rk_user.focus_update()

но я думаю, что нет необходимости проверять оба

Я думаю, это должно быть либо:

if hasattr(request, 'rk_user') :
            request.rk_user.focus_update()

или

* * 1010

Я прав?

Ответы [ 3 ]

7 голосов
/ 10 марта 2011

Хотя другие ответчики правы в том, что они проверяют разные вещи, вы можете объединить две проверки в одну команду:

if getattr(request, 'rk_user', None):

Получает атрибут, если он существует, и если нет, получает Нет;затем он проверяет, что полученное значение не является пустым.

3 голосов
/ 10 марта 2011

Они проверяют разные вещи. Один проверяет, чтобы убедиться, что доступ к 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, тогда стоит проверить его. Но вы не собираетесь действительно охватывать все ваши базы или пути потенциальных исключений какими-либо условными условиями, поэтому проверяйте только то, что вы ожидаете разумно ожидать, и используйте логику для обработки.

1 голос
/ 10 марта 2011

Похоже, rk_user это пользовательский атрибут в модели запроса? Вы обязательно должны включить блок hasattr if. И другие. У вашего босса правильный код.

EDIT
Я предполагаю, что это может быть нулем, и вы действительно хотите, чтобы код правильно обрабатывал это условие. Конечно, если вы на 100% уверены, что это значение никогда не может быть нулевым, не стесняйтесь оставлять отметку, но подумайте о будущих разработчиках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...