您好
我正在研究一个django项目,我想在那里存储一套课程要求,但这些要求并不简单,它们可能是and / or
的组合,即
((course1 or course2) and course3)
我找到了this boolean parser,并且有点想出它是如何工作的,唯一的关键是,一旦获得操作数,它就会使用eval()
来查找变量的值。
在我的例子中,这些值将是动态的,需要根据某些参数进行计算。任何有关实施的想法都会非常有用。
答案 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