热切地评估Python中的布尔表达式

Man*_*áoz 3 python exception-handling eager lazy-evaluation

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

我们来看看:

>>> x = 3
>>> 5 < x < y
False
Run Code Online (Sandbox Code Playgroud)

哎呀!这非常好,因为无论y价值如何,这都是假的.事情是,y甚至可以是未定义的,我想得到那个例外.即使事先知道结果,我怎样才能让python评估所有表达式?

希望我清楚自己!谢谢,
曼努埃尔

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

Ale*_*lli 6

(5 < x) & (x < y)
Run Code Online (Sandbox Code Playgroud)

通过使用比特和运营商&,你没有短路行为(如你得到and,or,链接,all/ any).短路通常被认为是可取的(快速和c)但如果你真的想要它并不难,没有它;-).

  • 但是,我想对这个问题的任何答案都会很糟糕. (3认同)
  • 不,有些答案比其他答案更可怕.这是非常微妙的,并且在检查时意图不明确(它看起来像是对按位运算符的误用),这使得它比Mike Graham的回答更加可怕,或者特别是php的答案太多(聪明的[好的方式],如果不是一般情况!) (3认同)

Ign*_*ams 5

all([5 < x, x < y])
Run Code Online (Sandbox Code Playgroud)

  • @Alex:甚至在创建列表时? (3认同)
  • 不,"所有"短路但列表理解是急切的(genexp是懒惰的等价物).所以`x <y` _is_将被评估 - 如果_it_引发一个传播的异常 - 但隐含的`和`仍然不会使用它的结果(当```是3时),所以任何异常来自_that_ use(对于特殊的`y`s确实;-)仍然可能会被隐藏起来.像`&`(bitwise-and)这样的非短路运算符可以获得100%的路径(获得任何可能会出现问题的异常),而你的方法可能会略微缩短(不是太多). (2认同)

Mik*_*ham 5

最自然的方式可能是评估先前行的表达式.

a = foo()
b = bar()
if a and b:
    ...
Run Code Online (Sandbox Code Playgroud)

作为all([5 < x, x < y])隐藏的解决方案,副作用很重要,使用按位和(&)的解决方案似乎微妙和误用 - 这两个都需要在您的代码中注释,以显示您正在强制评估并将导致人们阅读您的代码思考什么他在想什么?.将重要的计算放在他们自己的行上比将它们隐藏在微妙的,一目了然的丑陋代码中更有意义.

虽然我的解决方案不会阻止NameErrorif b不存在(即,你有一个错字)并且a是错误的,但是如果你选择的话,你应该能够通过阅读你的代码并使用bugfinder来解决这个问题.