Python函数指针

时间:2010-02-17 18:07:51

标签: python function-pointers

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

myvar = 'mypackage.mymodule.myfunction'

我现在想要像这样调用我的功能

myvar(parameter1, parameter2)

实现这一目标的最简单方法是什么?

8 个答案:

答案 0 :(得分:96)

funcdict = {
  'mypackage.mymodule.myfunction': mypackage.mymodule.myfunction,
    ....
}

funcdict[myvar](parameter1, parameter2)

答案 1 :(得分:35)

能够只存储函数本身要好得多,因为它们是python中的第一类对象。

import mypackage

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

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

mypackage = __import__('mypackage')
mymodule = getattr(mypackage, 'mymodule')
myfunction = getattr(mymodule, 'myfunction')

myfunction(parameter1, parameter2)

但请记住,所有这些工作都适用于您目前所处的任何范围。如果您不以某种方式坚持下去,如果您离开当地范围,您就不能指望他们留下来。

答案 2 :(得分:12)

def f(a,b):
    return a+b

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

<强>输出

 5

答案 3 :(得分:8)

最简单

eval(myvar)(parameter1, parameter2)

您没有“指针”功能。你有一个功能“名称”。

虽然效果很好,但是你会有很多人告诉你它“不安全”或“安全风险”。

答案 4 :(得分:5)

为什么不存储功能本身? myvar = mypackage.mymodule.myfunction更清洁。

答案 5 :(得分:4)

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

答案 6 :(得分:2)

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

compile(...,'eval')只允许一个语句,因此调用后不能有任意命令,否则会出现SyntaxError。然后,一小部分验证可以至少将表达式约束在你的力量中,比如测试“mypackage”开始。

答案 7 :(得分:2)

我在创建库来处理身份验证时遇到了类似的问题。我希望应用程序所有者使用我的库能够在库中注册回调,以检查经过身份验证的人所在的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的方法来做到这一点?