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