我将函数名称存储在这样的变量中:
myvar = 'mypackage.mymodule.myfunction'
现在我要这样调用myfunction
myvar(parameter1, parameter2)
最简单的方法是什么?
我将函数名称存储在这样的变量中:
myvar = 'mypackage.mymodule.myfunction'
现在我要这样调用myfunction
myvar(parameter1, parameter2)
最简单的方法是什么?
Answers:
funcdict = {
'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
....
}
funcdict[myvar](parameter1, parameter2)
能够只存储函数本身会更好,因为它们是python中的一流对象。
import mypackage
myfunc = mypackage.mymodule.myfunction
myfunc(parameter1, parameter2)
但是,如果必须动态导入软件包,则可以通过以下方法实现:
mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')
myfunction(parameter1, parameter2)
但是请记住,所有这些工作都适用于您当前所在的任何范围。如果您不以某种方式坚持使用它们,那么如果您离开本地范围,就不能指望它们会继续存在。
def f(a,b):
return a+b
xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))
输出值
5
最简单的
eval(myvar)(parameter1, parameter2)
您没有函数“指针”。您有一个函数“名称”。
尽管这很好用,但是您将有很多人告诉您这是“不安全的”或“安全风险”。
在创建用于处理身份验证的库时遇到了类似的问题。我希望使用我的库的应用程序所有者能够在该库中注册一个回调,以检查针对经过身份验证的人员所在的LDAP组的授权。配置作为传入的config.py文件传入并包含一个dict所有的配置参数。
我得到这个工作:
>>> class MyClass(object):
... def target_func(self):
... print "made it!"
...
... def __init__(self,config):
... self.config = config
... self.config['funcname'] = getattr(self,self.config['funcname'])
... self.config['funcname']()
...
>>> instance = MyClass({'funcname':'target_func'})
made it!
有pythonic-er的方法吗?
myvar = mypackage.mymodule.myfunction
更干净。