【问题标题】:Python parsing boolean expressions with custom evaluationsPython 使用自定义评估解析布尔表达式
【发布时间】:2011-06-21 21:37:20
【问题描述】:

你好 我正在做一个 django 项目,我想在其中存储一组课程要求,但这些要求并不简单,它们可以是 and / or 的组合,即,

((course1 or course2) and course3)

我找到了this boolean parser,并且有点弄清楚它是如何工作的,唯一的问题是一旦它得到一个操作数,它就会使用eval() 来查找变量的值。 就我而言,这些值将是动态的,需要根据某些参数进行计算。任何关于实施的想法都会非常有帮助。

【问题讨论】:

    标签: python django boolean


    【解决方案1】:

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

    class NameResolver(object):
        def __getitem__(self, key):
            return "dynamic %r" % key
    
    >>> eval("foo, bar", {}, NameResolver())
    ("dynamic 'foo'", "dynamic 'bar'")
    

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

    【讨论】:

    • 谢谢,我认为这会奏效。是的,要求来自管理员。 (它们存储为课程模型的字符串部分。)
    【解决方案2】:

    尝试使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 2013-10-12
      相关资源
      最近更新 更多