Функциональный эквивалент логики операторов Python - PullRequest
3 голосов
/ 23 января 2011

Я пытаюсь найти функциональный эквивалент логических операторов в Python (например, и / или / нет). Я думал, что нашел их в модуле operator, но поведение совершенно иное.

Например, оператор and выполняет желаемое поведение, тогда как operator.and_, кажется, требует явного сравнения типов, иначе он вызывает исключение TypeError.

>>> from operator import *
>>> class A: pass
... 
>>> and_(A(), True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for &: 'instance' and 'bool'
>>> A() and True
True

Есть ли что-то похожее на модуль operator, но содержащий функции, которые точно соответствуют поведению логики операторов Python?

1 Ответ

9 голосов
/ 23 января 2011

Функции operator.and_ и operator.or_ эквивалентны побитовым"и" функциям "и" или "соответственно.В operator нет функций, представляющих операторы and и or, но вы можете вместо них использовать встроенные модули any() и all().Они будут принимать одну последовательность в качестве аргумента, но вы можете просто передать кортеж из двух записей, чтобы использовать их в качестве бинарных операторов.

Обратите внимание, что невозможно точно сопоставить логику and и orс любой функцией, которую вы вызываете.Например,

False and sys.stdout.write("Hello")

никогда ничего не печатает, в то время как

f(False, sys.stdout.write("Hello"))

всегда печатает вывод, независимо от того, как определено f().Это также причина, по которой они опущены в operator.

...