Python 指定使用exec命令从函数返回的数值

Python 指定使用exec命令从函数返回的数值,python,python-2.7,exec,Python,Python 2.7,Exec,我需要使用exec命令将函数返回的数值指定给变量名: def func1(x,y): return x+y def main(x,y,n): x=3; y=5; n=1 t = exec("func%s(%s,%s)" % (n,x,y)) return t**2 main(3,5,1) 我有很多函数,比如func1,func2等等。。。我尝试返回t=func1x,y和execfunc%s%s,%s%n,x,y语句。但是,我无法指定从exec返回的值 上有一

我需要使用exec命令将函数返回的数值指定给变量名:

def func1(x,y):
    return x+y

def main(x,y,n):
    x=3; y=5; n=1
    t = exec("func%s(%s,%s)" % (n,x,y))
    return t**2

main(3,5,1)
我有很多函数,比如func1,func2等等。。。我尝试返回t=func1x,y和execfunc%s%s,%s%n,x,y语句。但是,我无法指定从exec返回的值

上有一个部分类似的问题,但它是为Python3编写的,也不适用于我的案例

我们如何解决这个问题,或者是否有一种更优雅的方式来执行这样的操作,也许不使用“exec”

顺便说一下,由于func%s%s,%s%n,x,y是一条语句,所以我使用了exec。或者我应该更好地使用eval吗?

像问题中的示例代码那样,使用函数和变量的名称作为字符串或名称的位作为整数,这几乎总是一个非常糟糕的主意。原因之一是eval或exec可以做任何事情,您通常希望避免使用行为难以预测和推理的代码结构

因此,这里有两种方法可以以较少的痛苦获得相似的结果

首先:不要像上面代码中的1那样传递神奇的索引号,而是传递实际的函数,它本身就是Python中变量的一个非常合理的值

def main(x,y,f):
  return f(x,y)**2

main(3, 5, func1)
顺便提一下,问题中main的定义丢弃了传递给它的x、y、n的值。那可能是个错误

第二:不要让这些仅仅是函数,而是让它们成为类上的方法,传递的不是函数,而是类本身或类的实例

class Solver:
  def solve(self, x,y): return "eeeek, not implemented"

class Solver1:
  def solve(self, x,y): return x+y

def main(x, y, obj):
  return obj.solve(x,y)**2

main(3, 5, Solver1())
以下哪种方法更好取决于应用程序的细节。例如,如果您实际上有多个并行函数集-以及您的func1、func2等,还有其他func1、其他func2等-那么这就迫切需要一个面向对象的解决方案,即上面的第二种方法


总的来说,我支持第二种方法;随着需求的增长,它往往会产生更干净的代码。

为什么要这样做?这似乎是一个非常奇怪的设计。更具体地说:为什么要有所有这些函数,然后按名称引用它们,而不是将它们放在某种数据结构中?e、 例如,如果它们都是可以放入lambda中的类型,则其值为lambdas?的dict。关于其他可能方式的建议也非常受欢迎!:还有:你为什么说func。。。这是一份声明吗?在我看来,这是一种表达。如果你必须这样做,那么是的,你想要eval而不是exec——但是,同样,为什么?有更多的上下文是很有用的。这些功能是什么?为什么有这么多?你为什么这样称呼他们?如果细节是保密的,我相信你可以在战略上含糊其辞,或者编一个足够接近的封面故事……第二种方法对我帮助很大。我适当地修改了代码,现在,我不需要做这样的定义。谢谢!