Python:条件的智能评估

时间:2016-06-22 06:14:52

标签: python conditional eval

我在字符串中有条件(以python条件表示法),例如像这样:

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

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

my_result = eval(my_str)

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

现在我反过来这样做了:

eval("Some_Undefined_Var and 0")

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

你知道Python中的任何模块/库确实试图解决这些问题吗?

谢谢!

感谢您的回答。 我似乎没有很好地解释它。 我不想在NameError的情况下返回False - 我想要评估条件,如果它可以被评估。事实上,无论变量是否定义,它都可以。

它应该在数学意义上计算,即0 *and* ANYTHING总是假的。这同样适用于1 *OR* ANYTHING - >无论如何,总是会产生真正的......

我也想让它恢复原状。正如人类也会说的那样,NO_MATTER_WHAT && 0给出了0.即使解析器在看到NO_MATTER_WHAT未定义后立即退出...

1 个答案:

答案 0 :(得分:1)

如果您了解eval的危险并且只想为未定义的变量返回特殊值(例如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逻辑的表达式实现一个解析器:不是很重要,但我要说它需要几十行代码