3

有没有办法(使用eval或其他方法)在 python 中急切地评估布尔表达式?

让我们看看这个:

>>> x = 3
>>> 5 < x < y
False

哎呀!这非常好,因为无论y' 值如何,这都是错误的。问题是,y甚至可以是未定义的,我想得到那个例外。即使事先知道结果,如何让 python 评估所有表达式?

希望我说清楚了!谢谢,
曼努埃尔

编辑:请记住,不能修改表达式,只能修改评估技术。

4

6 回答 6

6
(5 < x) & (x < y)

通过使用位与运算符,&您不会获得短路行为(就像您使用and, or,链接,all/一样any)。短路通常被认为是可取的(快速&c),但如果你真的想要,它并不难做到;-)。

于 2010-02-16T06:23:49.103 回答
5
all([5 < x, x < y])
于 2010-02-16T06:21:06.410 回答
5

最自然的方法可能是评估前几行的表达式。

a = foo()
b = bar()
if a and b:
    ...

因为像all([5 < x, x < y])隐藏副作用很重要的解决方案和使用按位和 ( &) 的解决方案似乎很微妙和滥用——这两种方法都需要在代码中添加注释,以表明您正在强制评估,并且会导致阅读您的代码的人思考什么他在想吗???. 将重要的计算放在自己的行中比将它们隐藏在微妙的、乍一看难看的代码中更有意义。

虽然我的解决方案不能阻止NameErrorifb不存在(即您有错字)并且a是错误的,但您应该能够通过阅读您的代码并使用错误查找器(如果您选择)来弄清楚这一点。

于 2010-02-16T06:33:34.603 回答
3
>>> x = 3
>>> y > x > 5
回溯(最近一次通话最后):
  文件“”,第 1 行,在
NameError:名称'y'未定义
于 2010-02-16T06:23:59.257 回答
2

如果您只是想排除程序员错误的可能性,那么急切地评估表达式不会有太大作用。例如,错误地做x or y()而不是x() or y() 不会被检测到。也许您实际上正在寻找像pylintpyflakespychecker这样的工具。

于 2010-02-16T06:51:44.180 回答
1

如果您从用户那里接收语句并想用自己的语义执行它,您应该使用诸如pyparsing. 在你的中间评估别人的代码是混乱和不安全的,将他们的结果与你的结果混合在一起,评估看起来是 Python 代码但语义不同的代码是令人困惑的。

于 2010-02-16T17:46:36.467 回答