python函数指针

Python function pointer

我在这样的变量中存储了一个函数名:

1
myvar = 'mypackage.mymodule.myfunction'

现在我想这样调用我的函数

1
myvar(parameter1, parameter2)

最简单的方法是什么?


1
2
3
4
5
6
funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)


只存储函数本身就更好了,因为它们是Python中的一流对象。

1
2
3
4
import mypackage

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

但是,如果必须动态导入包,则可以通过以下方式实现:

1
2
3
4
5
mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')

myfunction(parameter1, parameter2)

然而,请记住,所有这些工作都适用于您当前所处的任何范围。如果你不以某种方式坚持它们,那么如果你离开本地范围,你就不能指望它们会留下来。


1
2
3
4
5
def f(a,b):
    return a+b

xx = 'f'
print eval('%s(%s,%s)'%(xx,2,3))

产量

1
 5


最容易的

1
eval(myvar)(parameter1, parameter2)

您没有函数"指针"。您有一个函数"name"。

虽然这很有效,但是会有很多人告诉您这是"不安全"或"安全风险"。


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


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


我在创建用于处理身份验证的库时遇到了类似的问题。我希望使用我的库的应用程序所有者能够在库中注册回调,以便根据认证人员所在的LDAP组检查授权。配置将作为一个config.py文件传入,该文件将被导入并包含一个包含所有配置参数的dict。

我要用这个:

1
2
3
4
5
6
7
8
9
10
11
>>> 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!

有没有做这个的方法?


eval(compile(myvar,'','eval'))(myargs)

compile(…,'eval')只允许使用一条语句,这样在调用后就不会有任意命令,否则会出现语法错误。然后,一点点验证至少可以将表达式限制在您的能力范围内,比如开始测试"mypackage"。