2016-08-19 99 views
2

我有进口函数名的列表蟒蛇进口功能,我可以调用如下:呼叫使用字符串

from myfile import function1 
from myfile import function2 

function1() 
function2() 

我怎么会调用的函数从名称列表?例如:

fns = ['function1', 'function2'] 
for fn in fns: 
    fn() 

我会如何正确执行上述操作?

回答

4

不使用字符串列表,只是存储在列表中的功能:

fns = [function1, function2] 
for fn in fns: 
    fn() 
+0

这是正确的答案。 –

2

您可以从globals()命名空间访问函数对象,但请注意,这不是一种常规方法,因为首先导入的对象应该是可调用的(具有__call__属性),它们应该存在于全局名称空间中。

for fn in fns: 
    try: 
     globals()[fn]() 
    except KeyError: 
     raise Exception("The name {} is not in global namespace".format(fn)) 

例子:

>>> from itertools import combinations, permutations 
>>> 
>>> l = ['combinations', 'permutations'] 
>>> for i in l: 
...  print(list(globals()[i]([1, 2, 3], 2))) 
... 
[(1, 2), (1, 3), (2, 3)] 
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] 
+0

我不推荐在生产代码中使用自检工具,但在很多情况下,这不一定像预期的那样工作,比如尝试导入模块本身不起作用:'import math l globals()[“math .sqrt“](4)' –

+0

@ TadhgMcDonald-Jensen事实上,我正在更新答案。 – Kasramvd