Python使用自定义评估解析布尔表达式

时间:2011-02-05 14:38:32

标签: python django boolean

您好 我正在研究一个django项目,我想在那里存储一套课程要求,但这些要求并不简单,它们可能是and / or的组合,即

((course1 or course2) and course3)

我找到了this boolean parser,并且有点想出它是如何工作的,唯一的关键是,一旦获得操作数,它就会使用eval()来查找变量的值。 在我的例子中,这些值将是动态的,需要根据某些参数进行计算。任何有关实施的想法都会非常有用。

2 个答案:

答案 0 :(得分:2)

您可以为这样的名称创建自己的解析器:

class NameResolver(object):
    def __getitem__(self, key):
        return "dynamic %r" % key

>>> eval("foo, bar", {}, NameResolver())
("dynamic 'foo'", "dynamic 'bar'")

但是,网站的管理员是否配置了这些要求?使用eval()将执行任何代码,因此它始终存在潜在的安全风险。如果要求来自不受信任的来源,那么使用ast模块构建自定义解析器将是更好的解决方案。

答案 1 :(得分:1)

尝试使用Python表达式和eval()函数:

>>> course1 = True
>>> course2 = False
>>> course3 = True
>>> print eval('(course1 or course2) and course3')
True

但是如果表达式可以来自你的应用程序之外,你就会遇到安全问题,因为人们可以注入并执行任意Python。

在这种情况下,请查看ast.literal_eval()。请参阅:http://docs.python.org/library/ast.html#ast.literal_eval