2014-10-12 54 views
0

我有一个简单的函数,用生成的飞行一段代码块: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部分。这是一个解决约束满足问题的简单程序。程序的一部分是即时接受这些约束并创建这些代码块。

+1

请不要这样做。如果可以避免使用eval和exec,那么它们都不应该被使用,因为它们造成了巨大的安全漏洞,并且难以进行调试。是否有理由不能将您的表达式和语句编写为可以使用例如参数化的函数? functools.partial?此外,还有python中的丰富比较方法,也许你可以考虑使用这些方法而不是isEqual。 – deets 2014-10-12 13:38:08

+1

不可能说没有看到完整的代码示例,为什么这不起作用。我同意deets,这可能是矫枉过正,并有可能更简单的方法来做到这一点。另外,不要实现'isEqual',实现'__eq__',然后使用'cellA == cellB'。 – 2014-10-12 13:40:53

+0

我并不担心调试的安全性,这是一个简单的约束满足求解器,这个简单程序的主要观点是它可以动态约束并将其转换为代码块。 – Limon 2014-10-12 13:41:29

回答

1

(这应该是一个评论,但过长)

工作正常,我在Python 2.7和3.2:

>>> variables = ["cellA", "cellB"] 
>>> expression = "cellA.isEqual(cellB)" 
>>> chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")") 
>>> chunk 
<function <lambda> at 0x6ffffcaa6e0> 
>>> class Cell(object): 
... def isEqual(self, other): 
...  return 27 
... 
>>> chunk(Cell(), Cell()) 
27 

如果你有问题,你需要表现出一定的代码这证明了问题,而不是模糊地描述你认为问题可能是什么。

+0

谢谢,我不知道为什么这样不能在早些时候工作?这基本上是我在我的开场白中写的,这也是我在我的程序中尝试过的,但它一直在崩溃。 – Limon 2014-10-12 13:59:37

0

对于您的实际问题,您可以简单地使用unbound方法isEqual。

class Cell(object): 

    def __init__(self, *args): 
     self._args = args 

    def isEqual(self, other): 
     return self._args == other._args 


a = Cell(1,2) 
b = Cell(3, 4) 


f = Cell.isEqual 
print f(a, b)