Python - оценивает все условия условного оператора - PullRequest
0 голосов
/ 01 ноября 2018

В следующем коде, если a() возвращает 1, b() не оценивается:

if (a() or b()):
    # do stuff

Как я могу убедиться, что все функции в операторе будут оцениваться независимо от их результата? В некоторых языках они используют | и ||, чтобы различать две возможности. Есть ли что-нибудь эквивалентное в Python? Тот же вопрос для заявления and.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Вы можете использовать любой метод, который принимает список функций, т.е.

if any([a(), b()]):
    ...
0 голосов
/ 01 ноября 2018

Если вам нужны обе функции для запуска, вероятно, было бы лучше всего быть явным и записать их полностью:

x = a()
y = b()

if x or y:
  pass

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

0 голосов
/ 01 ноября 2018

Если вам все еще нужна логика or без короткого замыкания, сначала оцените все операнды, а затем используйте any:

if any([a(), b()]):
    ...

Прежде чем список будет передан в any (что возвращает True, если какое-либо значение в списке является достоверным), список должен сначала быть создан (то есть функции будут вызваны и их результаты возвращены).

.

Обратите внимание, однако, что функции должны быть чистыми и не вызывать побочные эффекты, чтобы сделать хакерские обходные пути, подобные этому, необходимыми.

...