使用实例生成Python代码块
我有一个简单的函数,可以使用以下函数动态生成一些代码块:使用实例生成Python代码块,python,eval,Python,Eval,我有一个简单的函数,可以使用以下函数动态生成一些代码块: chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")", namespace) 这将在稍后使用以下命令运行: apply(chunk, variableValues) 这适用于基本表达式,如 variables = ["a", "b"] expression = "a != b" variableValues = [5, 6] 但是,现在我想用
chunk = eval("(lambda " + ','.join(variables) + " : " + expression + ")", namespace)
这将在稍后使用以下命令运行:
apply(chunk, variableValues)
这适用于基本表达式,如
variables = ["a", "b"]
expression = "a != b"
variableValues = [5, 6]
但是,现在我想用实例替换这些简单变量,表达式将是一个函数调用。我已经尝试了很多东西,但我不知道如何让这个工作。。。理想情况下,我想做以下事情:
variables = ["cellA", "cellB"]
expression = "cellA.isEqual(cellB)"
variableExpression = [Cell(4, 5), Cell(5, 3)]
其中Cell只是我创建的实现isEqual()的类
编辑:我不能跳过这个的评估部分。这是一个解决约束满足问题的简单程序。程序的一部分是动态地接受这些约束并创建这些代码块。对于您的实际问题,您可以简单地使用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)
(这应该是一个注释,但太长)
在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
变量=[“cellA”,“cellB”]
>>>expression=“cellA.isEqual(cellB)”
>>>chunk=eval(“(lambda“+”,”.join(变量)+:“+表达式+”)
>>>大块
>>>类单元格(对象):
... def isEqual(自身、其他):
... 返回27
...
>>>块(单元格(),单元格())
27
如果您有问题,您需要显示一些代码来演示问题,而不是含糊其辞地描述您认为问题可能是什么。请不要这样做。如果有可能避免使用eval和exec,则不应使用eval和exec,因为它们会造成巨大的安全漏洞,并使调试变得困难。是否有原因使您不能将表达式和语句编写为可以使用functools.partial等参数化的函数?此外,在Python中有丰富的比较方法,也许你可以考虑使用这些,而不是等号。不知道为什么没有看到完整的代码示例就不能工作。我同意deets的观点,这可能是杀伤力过大,可能有更简单的方法。另外,不要实现
isEqual
,实现\uuuueq\uuuuu
,然后使用cellA==cellB
。我不担心调试的安全性。这是一个简单的约束满足解算器,这个简单程序的要点是它可以动态地接受约束并将其转换为代码块。谢谢,我不知道为什么这之前不起作用?这基本上是我在我的开场白中写的,也是我在我的程序中尝试过的,但它一直在崩溃。