在Python中急切求值布尔表达式
有没有办法(用 eval
或其他方法)在 Python 中提前计算布尔表达式?
我们来看这个例子:
>>> x = 3
>>> 5 < x < y
False
哎呀!这真不错,因为无论 y
的值是什么,这个结果都会是假的。问题是,y
甚至可能是未定义的,我想要得到那个异常。有没有办法让 Python 计算所有表达式,即使它已经知道结果是什么?
希望我说得够清楚!谢谢,
Manuel
补充:请记住,表达式本身不能被修改,只能改变计算的方法。
6 个回答
5
最自然的方式可能就是在前面的行中计算表达式。
a = foo()
b = bar()
if a and b:
...
因为像 all([5 < x, x < y])
这样的写法会让人忽视副作用的重要性,而使用位运算符 &
的解决方案看起来又很微妙,容易误用——这两种写法都需要在代码中加注释,才能让人明白你是在强制计算,这样会让阅读你代码的人想:他在想什么呢??? 把重要的计算放在单独的行上,比把它们藏在看起来复杂、乍一看又不太好看的代码中要合理得多。
虽然我的解决方案不能防止出现 NameError
,如果 b
不存在(也就是说,你可能打错了)而 a
是假的,这个问题你应该能通过阅读代码和使用调试工具来发现。
6
(5 < x) & (x < y)
使用位与运算符 &
时,你不会像使用 and
、or
、链式操作、all
/any
那样出现短路行为。短路行为通常被认为是好的,因为它可以让程序运行得更快。不过,如果你真的想要的话,没有短路行为也不难实现;-)。
5
all([5 < x, x < y])
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。