Mar*_*ers 14
的or操作者的短路 ; 当左侧返回真值时,不评估右侧表达式.这也适用于and运营商; 当左侧表达式返回false值时,不评估右侧表达式.
你不能用一个函数做到这一点; 所有操作数都进行评估功能,可以调用之前.因此,operator模块中没有相同的功能.
相比:
foo = None
result = foo and foo(bar)
Run Code Online (Sandbox Code Playgroud)
同
foo = None
result = operator.boolean_and(foo, foo(bar)) # hypothetical and implementation
Run Code Online (Sandbox Code Playgroud)
后一个表达式将失败,因为您不能将其None用作可调用对象.第一个版本有效,因为and运算符不会计算foo(bar)表达式.
与内置or函数最接近的是any:
>>> any((1, 2))
True
Run Code Online (Sandbox Code Playgroud)
如果你想复制or返回非布尔操作数的功能,你可以使用next和filter:
>>> next(operand for operand in (1, 2) if operand)
1
Run Code Online (Sandbox Code Playgroud)
但就像Martijn所说的那样,or由于它的短路,它们都不是真正的替代品.真正的or函数必须接受函数才能避免评估所有结果:
logical_or(lambda: 1, lambda: 2)
Run Code Online (Sandbox Code Playgroud)
这有点笨拙,并且与operator模块的其余部分不一致,所以最好不要将它遗漏,而是使用其他显式方法.