我在字符串中有条件(以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
未定义后立即退出...
答案 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
逻辑的表达式实现一个解析器:不是很重要,但我要说它需要几十行代码