如何调用导入的python模块中的每个函数

How to call every function in an imported python module

我编写了一个程序,它创建和维护一个数组,我编写了另一个模块,它具有操作数组的功能。是否可以调用导入模块中的每个函数而不必对每个函数调用进行硬编码?意思是这样的:

1
2
3
4
5
#Some way I don't know of to get a list of function objects
    listOfFunctions = module.getAllFunctions()

    for function in listOfFunctions:
        array.function()

我希望这样做,这样我就不必每次向操纵模块添加函数时都更新主文件。

我发现了这些:

如何从python目录中的每个模块调用函数?

是否可以列出模块中的所有功能?

列出python模块中的所有函数

而且也只能在python文档的模块中列出函数。我可以用一些字符串操作和eval()函数来实现这一点,但我觉得必须有一种更好的、更Python式的方法。


导入模块时,__dict__属性包含模块中定义的所有内容(变量、类、函数等)。您可以对其进行迭代,并测试该项是否为函数。例如,可以通过检查__call__属性来完成:

1
2
listOfFunctions = [f for f in my_module.__dict__.values()
                   if hasattr(f,'__call__')]

然后,我们可以通过调用__call__属性来调用列表中的每个函数:

1
2
for f in listOfFunctions:
    f.__call__()

但是要小心!这本词典没有保证的顺序。函数将以某种随机顺序调用。如果顺序很重要,您可能希望使用强制执行此顺序的命名方案(fun01-do-u-something、fun02-do-u-something等),并首先对字典的键进行排序。


我想你想做这样的事情:

1
2
3
4
5
6
7
8
import inspect

listOfFunctions = [func_name for func_name, func in module.__dict__.iteritems()\
                  if inspect.isfunction(func)]

for func_name in listOfFunctions:
    array_func = getattr(array, func_name)
    array_func()