在Python中急切求值布尔表达式

3 投票
6 回答
2116 浏览
提问于 2025-04-15 19:20

有没有办法(用 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)

使用位与运算符 & 时,你不会像使用 andor、链式操作、all/any 那样出现短路行为。短路行为通常被认为是好的,因为它可以让程序运行得更快。不过,如果你真的想要的话,没有短路行为也不难实现;-)。

5
all([5 < x, x < y])

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答