"3.95.131.208 - 3.95.131.208"

Python - логический порядок оценки в выражении "if"

В Python мы можем сделать это:

if True or blah:
    print("it ok") # will be executed

if blah or True: # will raise a NameError
    print("it not ok")

class Blah:
    pass
blah = Blah()

if blah or blah.notexist:
    print("it ok") # also will be executed
  • Может кто-нибудь указать мне на документацию по этой функции?
  • Является ли это деталью реализации или особенностью языка?
  • Это хороший стиль кодирования для использования этой функции?
+7
источник поделиться
4 ответа

Короткое замыкание or и and, см. документацию Логические операции:

Выражение x and y сначала оценивает x; если x false, возвращается его значение; в противном случае y оценивается и возвращается возвращаемое значение.

Выражение x or y сначала оценивает x; если x истинно, возвращается его значение; в противном случае y оценивается и возвращается возвращаемое значение.

Обратите внимание, что для and, y оценивается только в том случае, если x оценивает значение True. И наоборот, для or, y оценивается только в том случае, если x оценивается как значение False.

Для первого выражения True or blah это означает, что blah никогда не оценивается, так как первая часть уже True.

Кроме того, ваш пользовательский класс blah считается True:

В контексте булевых операций, а также когда выражения используются операторами управления потоком, следующие значения интерпретируются как ложные: False, None, числовой нуль всех типов и пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и фризоздаты). Все остальные значения интерпретируются как истинные. (См. __nonzero__() специальный способ для изменения этого параметра.)

Поскольку ваш класс не реализует метод __nonzero__() (или метод __len__), он считается True в отношении булевых выражений.

В выражении blah or blah.notexist, blah, таким образом, истинно, а blah.notexist никогда не оценивается.

Эта функция используется довольно регулярно и эффективно опытными разработчиками, чаще всего указывая значения по умолчанию:

some_setting = user_supplied_value or 'default literal'
object_test = is_it_defined and is_it_defined.some_attribute

Соблюдайте осторожность при привязке их и используйте условное выражение вместо этого, где это применимо.

+21
источник

Это называется короткозамкнутым и является признаком языка:

http://docs.python.org/2/tutorial/datastructures.html#more-on-conditions

Булевы операторы and и or являются так называемыми операторами короткого замыкания: их аргументы оцениваются слева направо, и оценка останавливается, как только результат определяется. Например, если A и C являются истинными, но B является ложным, A и B и C не оценивают выражение C. При использовании в качестве общего значения, а не как булево, возвращаемое значение оператора короткого замыкания является последним оцененный аргумент.

+5
источник

Это то, как работают операторы логические операторы, в частности or в python: оценка короткого замыкания.

Чтобы лучше объяснить это, рассмотрите следующее:

if True or False:
    print('True') # never reaches the evaluation of False, because it sees True first.

if False or True:
    print('True') # print True, but it reaches the evaluation of True after False has been evaluated.

Для получения дополнительной информации см. следующее:

+2
источник

С помощью оператора or значения оцениваются слева направо. После того, как одно значение оценивается как True, весь оператор оценивается как True (поэтому не вычисляется больше значений).

+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос