Python: 条件的智能评估

Python: Intelligent eval of conditions

我在字符串中有条件(在 python 条件符号中),例如像这样:

my_str = "0 and (not (1 and 0) or B_undefined_variable)"

我想计算条件结果(在数学意义上)。我正在使用 eval(不用担心,我知道它是邪恶的 ;-))。

my_result = eval(my_str)

我发现,当 B 被用作字母而不被定义为变量时它甚至可以工作,因为 0 and ANYTHING 总是 False。

现在当我反过来做时:

eval("Some_Undefined_Var and 0")

它停止工作。所以 eval 似乎在没有 TRYING 完成解析整个方程的情况下引发 NameError-Exception。

你知道 Python 中的任何模块/库都试图解决这种情况吗?

谢谢!


感谢您的回答。 看来我没有解释清楚。 在 NameError 的情况下,我不想 return False - 如果可以评估条件,我希望对其进行评估。事实上,无论变量是否定义,它都可以。

它应该在数学意义上计算,即 0 *and* ANYTHING 将始终为 False。这同样适用于 1 *OR* ANYTHING --> 无论如何都会产生 TRUE..

而且我想让它也适用于恢复的条件。你,作为一个人也会说,NO_MATTER_WHAT && 0 给出 0。即使解析器在看到 NO_MATTER_WHAT 未定义后会立即退出...

如果您了解 eval 的危险并且只想 return 未定义变量的特殊值(例如 9999),您可以做的是自定义 eval 使用的字典:

import collections
d = collections.defaultdict(lambda : 9999)
d['x'] = 21
d['y'] = 2
print(eval('x * y', {}, d))    # ==> 42
print(eval('z', {}, d))        # ==> 9999

我能想到的唯一其他选择是为使用您正在寻找的 and 逻辑的表达式实现一个解析器:没什么大不了的,但我想说它需要几十行代码。