代码之家  ›  专栏  ›  技术社区  ›  Vishal

从Python中的客户机数据构造if语句

  •  0
  • Vishal  · 技术社区  · 15 年前

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

    条件:条件1、条件2、条件3、条件4 逻辑运算符:lo1、lo2、lo3(可能的值:“and”“or”)

    如。

    if condition1 lo1 condition2 lo3 condition4:
        # Do something
    

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

    PS:客户端:flex,服务器端:python,通过Internet

    谢谢

    3 回复  |  直到 15 年前
        1
  •  1
  •   Will Hardy    15 年前

    定义自己的函数,该函数接受两个条件和一个运算符,并计算:

    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 condition2 在里面 my_eval ,您可能不打算真实地测试字符串:—)

        2
  •  1
  •   Peter Lyons    15 年前

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

    现在,如果一组运算符和表达式非常大,请考虑定义 Domain Specific Language 并且解析它,这比评估原始代码要安全得多。我自己还没有做过DSL,但我听说python有很好的库( PLY 可能会有所帮助)。

        3
  •  0
  •   ThomasH    15 年前

    伊格纳西奥的回答是前进的道路。检查你的数据,一路建立你的复杂条件。但你必须在基本条件下使用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
    

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