GOOGLE ADS

воскресенье, 10 апреля 2022 г.

если x:, vs если x == True, vs если x true

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

x = True
if x:
run function

Однако теперь я обнаружил, что x не обязательно должен быть буквально "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:, может ли кто-нибудь объяснить, почему происходит такое поведение? Кажется, что if x: это скорее тест на «если x не является ложным» или «если x существует». Имея это в виду, я считаю, что мне следует использовать if x is True: в этом случае, несмотря на то, что должен сказать PEP 8.


Решение проблемы

Следующие значения в 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это правда», то это выражает то, что делает ваш исходный код. Документирование этого «запускает функцию, если x is True» будет иметь другое значение и реже используется именно из-за правила стиля в PEP8, которое говорит проверять на истинность, а не на конкретное значение True.

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

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...