Python:在函数中传递函数名作为参数

2024-04-25 03:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将函数名作为参数传递到另一个函数中,但得到一个错误:“TypeError:”str“object is not callable”。下面是一个简单的问题示例:

def doIt(a, func, y, z):
    result = z
    result = func(a, y, result)
    return result

def dork1(arg1, arg2, arg3):
    thing = (arg1 + arg2) / arg3
    return thing

def dork2(arg1, arg2, arg3):
    thing = arg1 + (arg2 / arg3)
    return thing

当我这样叫道:

var = 'dork1'
ned = doIt(3, var, 4, 9)
print (ned)

我得到:

Traceback (most recent call last):
   File "<pyshell#9>", line 1, in <module>
     ned = doIt(3, var, 4, 9)
   File "<pyshell#2>", line 3, in doIt
     result = func(a, y, result)
TypeError: 'str' object is not callable

Tags: 函数returnobjectvardefresultarg3func
3条回答

如果您想传递函数的名称,正如您所说并且您正在做的,当然您不能调用它——为什么要“调用a名称”?这毫无意义。

如果要调用它,请传递函数本身,也就是说,最重要的是而不是

var = 'dork1'

而是

var = dork1

没有引号!

编辑:评论中的操作奇迹(!)如何获得给定函数名的函数对象(作为字符串)。碰巧,我在OSCON教的一个教程(我刚刚回来)中展示了如何做到这一点——从here中获取幻灯片,并参见第47页“延迟加载回调”:

class LazyCallable(object):
  def __init__(self, name):
    self.n, self.f = name, None
  def __call__(self, *a, **k):
    if self.f is None:
      modn, funcn = self.n.rsplit('.', 1)
      if modn not in sys.modules:
        __import__(modn)
      self.f = getattr(sys.modules[modn],
                       funcn)
    self.f(*a, **k)

这样你就可以通过考试,从此过上幸福的生活。如果你不需要处理模块的话(这一定意味着多么奇怪的架构!)!-)调整这个代码很容易。

我很高兴找到这个,我不知道这是否是答案。我的解决办法如下:

def doIt(func, *args):
   func_dict = {'dork1':dork1,'dork2':dork2}
   result = func_dict.get(func)(*args)
   return result

def dork1(var1, var2, var3):
   thing = (float(var1 + var2) / var3)
   return thing

def dork2(var1, var2, var3):
   thing = float(var1) + (float(var2) / var3)
   return thing

可以按如下方式运行:

func = 'dork2'
ned = doIt(func,3, 4, 9)
print ned

不要传递函数名。

传递函数。

fun = dork1
ned = doIt(3, fun, 4, 9)
print (ned)

相关问题 更多 >