Python booleans - если x:, vs if x == True, vs, если x - True

Извините, если это было задано раньше, но я тщетно искал ответ на мой точный вопрос. В принципе, с Python 2.7 у меня есть программа, в которой запущена серия инструментов геообработки, зависит от того, что содержится в серии переменных True/False, которые пользователь настраивает в script например.

x = True

if x:
    run function

Однако теперь я обнаружил, что для функции не требуется буквально "True". Например:

In: x = True
    if x:
        print True

Out: True

In: x = 123
    if x:
        print True

Out: True

In: x = 'False'
    if x:
        print True

Out: True

In: x = False
    if x:
        print True

Out: 

Значит, любое значение, отличное от False, должно оцениваться как True, чего не было бы, если x == True или если x является True. Если PEP 8 настоятельно рекомендует использовать только вариант if x:, может ли кто-нибудь объяснить, почему это происходит? Кажется, что если x: больше является критерием "если x не является False" или "если x существует". Имея это в виду, я считаю, что я должен использовать, если x является True: в этом случае, несмотря на то, что PEP 8 должен сказать.

С уважением

Ответы

Ответ 1

Следующие значения в Python являются ложными в контексте if и других логических контекстов:

  • False
  • None
  • числовые значения, равные 0, такие как 0, 0.0, -0.0
  • пустые строки: '' и u''
  • пустые контейнеры (например, списки, кортежи и словари)
  • все, что реализует __bool__ (в Python3) для возврата False или __nonzero__ (в Python2) для возврата False или 0.
  • все, что не реализует __bool__ (в Python3) или __nonzero__ (в Python2), но реализует __len__, чтобы вернуть значение, равное 0

Объект считается "ложным", если применяется какое-либо из них, и "истинно" в противном случае, независимо от того, действительно ли он равен или идентичен с False или True

Теперь, если вы установили, что x обязательно является одним из объектов True или False, вы можете спокойно написать if x. Если вы указали, что "истинность" x указывает, выполнять или не выполнять операцию, независимо от типа, тогда вы можете спокойно написать if x. Где вы можете написать, что вы должны это делать, так как он чище читать.

Обычно, если для x разрешено принимать значение True, то вы находитесь в одном из этих двух случаев, и поэтому вы не будете писать if x is True. Важно правильно документировать значение x, чтобы он отражал тест, используемый в коде.

Программисты Python должны знать, что считается истинным, поэтому, если вы просто документируете, "запускает функцию, если x is true", то это выражает то, что делает ваш исходный код. Документируя это, "запускает функцию, если x is True" будет иметь другое значение и менее часто используется именно из-за правила стиля в PEP8, который говорит, чтобы проверить истинность, а не конкретное значение True.

Однако, если вы хотите, чтобы код вел себя по-другому в случае, когда x является пустым контейнером из случая, когда он None, вы должны написать что-то вроде if x is not None.

Ответ 2

x = 'False'
x = 123

Оба True

Другие значения истинности.

В документе описаны другие значения.

Что касается причины PEP8, то ее гораздо более семантический текст для чтения if this_file_is_green

Ответ 3

Другие значения ложности включают 0, '', []. Вы должны просто использовать версию if x:.

Ответ 4

Возможность сказать

if x:
   ...

считается особенностью. Вы также можете указать, когда тест следует считать переданным или нет для пользовательских классов (просто определите метод __nonzero__ в Python 2.x или __bool__ в Python 3).

Например, для строк и контейнеров, таких как списки, словари или наборы тестов if x ... означает "если x не пуст".

Обратите внимание, что причина не в том, что это позволяет писать меньше кода, но этот код легче читать и понимать.

Если вам нравится писать if x is True ..., вы решили пойти дальше по этому пути к if (x is True) is True ... или if ((x is True) is True) is True ...?: -)

Ответ 5

Само собой разумеется, что вы должны написать код, который делает то, что вам нужно. Но в большинстве случаев вам просто не нужно говорить == True или is True, потому что вам не нужно отличать True от других "правдивых" значений. Поэтому он рекомендовал оставить это для простоты.

Случай, когда вы определенно должны использовать == True или is True, - это когда вам нужно отличить True от других правных значений.

В вашем примере вас беспокоит разница между True и 123? Это скажет вам, каким образом его кодировать.

Одна вещь о кодировании == True или is True: он поднимет незначительный красный флаг, когда другие разработчики прочитают ваш код. Они не посчитают это неправильным, они просто зададут себе вопрос, почему он там, и захочет узнать, почему важно относиться к True по-другому от других правных значений в данном конкретном случае.

Другими словами, если вам это не нужно, лучше не использовать его.