【问题标题】:How to make a 'str' object callable using lambda functions?如何使用 lambda 函数使“str”对象可调用?
【发布时间】:2014-08-11 14:51:30
【问题描述】:

我有一些预定义的功能,例如: 添加主机、编辑主机、删除主机。

现在根据收到的一些参数,我必须调用上述函数之一。 现在 param 的值与上述函数之一相同。param 的类型是 str。

例如:如果参数是'addhost',那么我应该可以调用addhost()。 但是当我直接这样做时,它给了我'str' object is not callable的错误 我应该如何根据收到的参数调用适当的函数??

P.S.我不想使用条件,我只想使用 lambda 函数之类的东西。

【问题讨论】:

  • 这是个坏主意;将您的函数放在一个字典中,该字典以您要用于访问它们的字符串为键。
  • 在哪里/如何定义了这个函数?在一个模块中?当前范围内的功能?一个方法? (链接的问题似乎涵盖了大多数情况..)
  • str='os.unlink("这个程序")'

标签: python string lambda


【解决方案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

【讨论】:

  • eval 不允许使用函数的返回值。
  • 我假设他不需要返回任何东西。
  • 如果使用 eval [yech],使用 -f = eval("addhost"); f() 会更清楚。也就是说,依赖于函数是一个值这一事实。这种观察还允许没有 eval 的方法 - 即查找表,如字典 [yay],包括全局/本地 [yech],以及其他容器对象(甚至模块)通过属性/属性 [yay]跨度>
  • 感谢 user2864740,我正在使用您的建议来改进我的答案。
【解决方案2】:

我喜欢 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')

【讨论】:

    【解决方案3】:

    我会倾向于getattr 方法,如下所述:https://stackoverflow.com/a/3071/3757019

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多