如何使'str'对象可调用通过lambda函数?

4 投票
3 回答
3831 浏览
提问于 2025-04-18 10:33

我有一些预定义的函数,比如:addhost、edithost、deletehost。

现在根据收到的某个参数,我需要调用上述的某一个函数。这个参数的值和上面某个函数的名字是一样的。这个参数的类型是字符串(str)。

举个例子:如果参数是 'addhost',那么我应该能够调用 addhost() 函数。但是当我直接这样做时,会出现错误:'str' object is not callable。我该如何根据收到的参数来调用相应的函数呢?

附注:我不想使用条件语句,只想用类似于 lambda 函数的方式。

3 个回答

-1

我更倾向于使用这里提到的 getattr 方法: https://stackoverflow.com/a/3071/3757019

1

我喜欢jonrsharpe的想法,之前也用过。这个方法很简单:

如果你想优化一些东西,可以把函数字典放在callit外面。

def fun1():
    return 1

def fun2():
    return 2

def nofun():
    raise ValueError('Unknown function')

def callit(funname):
    d = dict(fun1=fun1, fun2=fun2)
    fun = d.get(funname, nofun)
    return fun()

callit('fun1')
callit('badbadbad')
1

简单调用 eval

>>> def addhost():
...  print "Add host"
... 
>>> def edithost():
...  print "Edit host"
... 
>>> def callstr(str):
...  f = eval(str)
...  f()
... 
>>> callstr("addhost")
Add host
>>> callstr("edithost")
Edit host
>>> 

如果你想使用 lambda:

>>> callstr2 = lambda x:eval(x)()
>>> callstr2("edithost")
Edit host
>>> callstr2("addhost")
Add host

撰写回答