首页 文章

Python:条件的智能评估

提问于
浏览
0

我在字符串中有条件(在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 回答

  • 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 逻辑的表达式实现一个解析器:不是很重要,但我要说它需要几十行代码 .

相关问题