有没有办法(使用eval
或其他方法)在 python 中急切地评估布尔表达式?
让我们看看这个:
>>> x = 3
>>> 5 < x < y
False
哎呀!这非常好,因为无论y
' 值如何,这都是错误的。问题是,y
甚至可以是未定义的,我想得到那个例外。即使事先知道结果,如何让 python 评估所有表达式?
希望我说清楚了!谢谢,
曼努埃尔
编辑:请记住,不能修改表达式,只能修改评估技术。
有没有办法(使用eval
或其他方法)在 python 中急切地评估布尔表达式?
让我们看看这个:
>>> x = 3
>>> 5 < x < y
False
哎呀!这非常好,因为无论y
' 值如何,这都是错误的。问题是,y
甚至可以是未定义的,我想得到那个例外。即使事先知道结果,如何让 python 评估所有表达式?
希望我说清楚了!谢谢,
曼努埃尔
编辑:请记住,不能修改表达式,只能修改评估技术。
(5 < x) & (x < y)
通过使用位与运算符,&
您不会获得短路行为(就像您使用and
, or
,链接,all
/一样any
)。短路通常被认为是可取的(快速&c),但如果你真的想要,它并不难做到;-)。
all([5 < x, x < y])
最自然的方法可能是评估前几行的表达式。
a = foo()
b = bar()
if a and b:
...
因为像all([5 < x, x < y])
隐藏副作用很重要的解决方案和使用按位和 ( &
) 的解决方案似乎很微妙和滥用——这两种方法都需要在代码中添加注释,以表明您正在强制评估,并且会导致阅读您的代码的人思考什么他在想吗???. 将重要的计算放在自己的行中比将它们隐藏在微妙的、乍一看难看的代码中更有意义。
虽然我的解决方案不能阻止NameError
ifb
不存在(即您有错字)并且a
是错误的,但您应该能够通过阅读您的代码并使用错误查找器(如果您选择)来弄清楚这一点。
>>> x = 3 >>> y > x > 5 回溯(最近一次通话最后): 文件“”,第 1 行,在 NameError:名称'y'未定义
如果您从用户那里接收语句并想用自己的语义执行它,您应该使用诸如pyparsing
. 在你的中间评估别人的代码是混乱和不安全的,将他们的结果与你的结果混合在一起,评估看起来是 Python 代码但语义不同的代码是令人困惑的。