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
逻辑的表达式实现一个解析器:没什么大不了的,但我想说它需要几十行代码。
我在字符串中有条件(在 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
逻辑的表达式实现一个解析器:没什么大不了的,但我想说它需要几十行代码。