2011-01-22 3 views
3

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

Например, оператор 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 модуля, но содержащие функций, которые соответствуют поведению заявления логики Пайтона именно?

+0

Почему бы вам не свернуть? 'def и_ (p1, p2): return p1 и p2' – rossipedia

+6

@Bryan: Легко, да, но OP делает это правильно (tm) и просит использовать существующее колесо, прежде чем изобретать его (даже если это займет всего несколько секунд) , – delnan

ответ

9

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

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

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

никогда ничего не печатать, а

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

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

+0

+1 Хороший вопрос об отсутствии короткого замыкания. – delnan

Смежные вопросы