оценка сложного условного питона - PullRequest
2 голосов
/ 01 февраля 2011
show_prev_btn = (len(sessions) > 0 and (sessions[0].pk == \
    Session.objects.filter(user=request.user).first().pk))

У меня есть логическое значение, которое я вычисляю.Sessions - это список, и если в нем 0 элементов, session [0] вызовет исключение.К счастью, я думаю, что я могу поймать его до того, как он будет оценен, проверив len (session)> 0.

Это работает на моей локальной машине разработки, но это нормально или я должен вложить эти условия?

Ответы [ 3 ]

5 голосов
/ 01 февраля 2011

В Python оператор and определен для использования оценки короткого замыкания .Так что если у вас есть выражение типа

a() and b()

, то сначала будет вызван a().Только если это вернет True, будет вызван b().Если a() возвращает False, то b() не будет вызываться, поэтому вы можете делать в b() действия, которые могут привести к сбою, если a() равен False.

Это, безусловно, принятая практикаи широко используется.

0 голосов
/ 01 февраля 2011

Чтобы скопировать из старый вопрос , попробуйте это. Синтаксис более интуитивно понятен, хотя разница произвольна.

sessions[0].pk == Session.objects.filter(user=request.user).first().pk) if len(sessions) else False
0 голосов
/ 01 февраля 2011

Преимущество вложенности условий в том, что в данном конкретном случае это может немного улучшить читаемость (за счет уменьшения длины строки).

Хотя, на мой взгляд, оба решения одинаково хороши, дело вкусаи стиль кода больше всего на свете (сомневаюсь, что различия в производительности, если таковые имеются, окажут большое влияние).

...