Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用实例生成Python代码块_Python_Eval - Fatal编程技术网

使用实例生成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
。我不担心调试的安全性。这是一个简单的约束满足解算器,这个简单程序的要点是它可以动态地接受约束并将其转换为代码块。谢谢,我不知道为什么这之前不起作用?这基本上是我在我的开场白中写的,也是我在我的程序中尝试过的,但它一直在崩溃。