Python函数指针

我有一个函数名称存储在这样的variables:

myvar = 'mypackage.mymodule.myfunction' 

现在我想要像这样调用我的function

 myvar(parameter1, parameter2) 

什么是最简单的方法来实现呢?

 funcdict = { 'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction, .... } funcdict[myvar](parameter1, parameter2) 

能够自己存储函数更好,因为它们是python中的第一类对象。

 import mypackage myfunc = mypackage.mymodule.myfunction myfunc(parameter1, parameter2) 

但是,如果您必须dynamic导入软件包,则可以通过以下方式实现此目的:

 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)) 

OUTPUT

  5 

为什么不存储函数本身? myvar = mypackage.mymodule.myfunction要干净得多。

最简单的

 eval(myvar)(parameter1, parameter2) 

你没有一个“指针”function。 你有一个“名字”的function。

虽然这样做效果很好,但你会有大量的人告诉你这是“不安全的”或“安全风险”。

 modname, funcname = myvar.rsplit('.', 1) getattr(sys.modules[modname], funcname)(parameter1, parameter2) 

eval(compile(myvar,'<str>','eval'))(myargs)

compile(…,'eval')只允许一个语句,所以在调用之后不能有任意的命令,否则会有一个SyntaxError。 然后,一小部分validation至less可以将expression式限制在某种能力之下,比如testing“mypackage”以开始。

我遇到类似的问题,同时创build一个库来处理身份validation。 我希望使用我的库的应用程序所有者能够在库中注册一个callback,以检查授权人员所在的LDAP组的授权。configuration将作为一个config.py文件传入,并且包含一个字典所有的configuration参数。

我得到这个工作:

 >>> 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的方法来做到这一点?