在以下代码中,如果a()
返回1,则不计算b()
:
if (a() or b()):
# do stuff
如何确保语句中的所有函数都将被求值,无论其结果如何?在某些语言中,他们使用|
和||
来区分这两种可能性。Python中有类似的东西吗?and
语句也有同样的问题。
如果您需要运行这两个函数,那么显式并完整地写出它可能是最干净的:
x = a()
y = b()
if x or y:
pass
这清楚地表明,这些呼吁必然会发生。将这个事实隐藏在条件中似乎是一个很好的方法,可以在未来忘记这个需求,并进行最终会让你痛苦的重构。
如果您仍然希望or
逻辑没有短路,请首先计算所有操作数,然后使用any
:
if any([a(), b()]):
...
在将列表传递给any
(如果列表中的任何值是真的,则返回True
(之前,必须首先创建列表(这意味着将调用函数并返回其结果(。
然而,请注意,功能应该是纯粹的,不会产生副作用,这样就有必要采用这种巧妙的解决方法。
您可以使用任何接受函数列表的方法,即
if any([a(), b()]):
...