从python中的客户端数据构造if语句

时间:2010-04-13 14:48:50

标签: python

我需要根据来自客户端的数据构造一个if语句,如下所示:

条件:condition1,condition2,condition3,condition4 逻辑运算符:lo1,lo2,lo3(可能的值:“和”“或”)

例如

if condition1 lo1 condition2 lo3 condition4:
    # Do something

我可以想到eval / exec但不确定它们有多安全!任何更好的方法或替代? 感谢您的回复:)

PS:客户端:Flex,服务器端:Python,通过互联网

由于

3 个答案:

答案 0 :(得分:1)

不要使用eval。这是一个巨大的安全风险。如果您的条件相对简单,我会考虑给用户一个体面的flex GUI,在其中输入它们,而不仅仅是原始文本区域,而是真正的表达式创建工具。在任何合理复杂的搜索应用程序中查看“高级搜索”功能的示例。然后将他们输入的数据导入GUI小部件并将其表示为对象。您可以将表达式建模为表达式链(15“鸭”5.3等),运算符(<> =!=等)和连词(AND OR NOT等),或沿着这些行的某些东西。然后我将这些编组为JSON,将它们解组为服务器端python代码中的python对象,并使用自定义python代码对它们进行评估。

现在,如果你设置的运算符和表达式非常大,可以考虑定义一个Domain Specific Language并解析它,这比评估原始代码要安全得多。我自己没有做过DSL,但是我被告知python有很好的库(PLY可能有帮助)。

答案 1 :(得分:1)

定义您自己的函数,它接受两个条件和一个运算符并进行求值:

def my_eval(condition1, lo, condition2)
    return {
      'and': condition1 and condition2,
      'or': condition1 or condition2
           }[lo]

然后评估该批次:

condition = conditions[0]
for cond, op in zip(conditions[1:], operators):
    condition = my_eval(condition, op, cond)

可以在condition1中预处理condition2my_eval,您可能不打算对字符串进行真实测试: - )

答案 2 :(得分:0)

伊格纳西奥的答案是要走的路。浏览您的数据,一直构建复杂的条件。但是你必须在基本条件下使用eval:

condition = eval(conditions[0])
for cond, op in zip(conditions[1:], operators):
    lop = operator.and_ if op == "and" else operator.or_
    condition = lop(condition, eval(cond))

if condition:
    # Do something

您可能希望确保条件列表中没有“恶意”条件,例如通过确保它们始终包含比较运算符(==,< =,....)。