我有一个简单的函数,用生成的飞行一段代码块:Python代码块生成与实例
chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")", namespace)
这就是后来的上运行使用:
apply(chunk, variableValues)
这正常工作与基本像
variables = ["a", "b"]
expression = "a != b"
variableValues = [5, 6]
但是,现在我想用实例和e代替这些简单的变量xpression将是一个函数调用。我曾尝试很多东西,但我不知道如何得到这个工作......我非常希望做这样的事情:
variables = ["cellA", "cellB"]
expression = "cellA.isEqual(cellB)"
variableExpression = [Cell(4, 5), Cell(5, 3)]
其中单元为只是一些I类作出的isEqual实现()。
编辑:我不能跳过这个eval部分。这是一个解决约束满足问题的简单程序。程序的一部分是即时接受这些约束并创建这些代码块。
请不要这样做。如果可以避免使用eval和exec,那么它们都不应该被使用,因为它们造成了巨大的安全漏洞,并且难以进行调试。是否有理由不能将您的表达式和语句编写为可以使用例如参数化的函数? functools.partial?此外,还有python中的丰富比较方法,也许你可以考虑使用这些方法而不是isEqual。 – deets 2014-10-12 13:38:08
不可能说没有看到完整的代码示例,为什么这不起作用。我同意deets,这可能是矫枉过正,并有可能更简单的方法来做到这一点。另外,不要实现'isEqual',实现'__eq__',然后使用'cellA == cellB'。 – 2014-10-12 13:40:53
我并不担心调试的安全性,这是一个简单的约束满足求解器,这个简单程序的主要观点是它可以动态约束并将其转换为代码块。 – Limon 2014-10-12 13:41:29