我有一个程序,我写的是创建和维护一个数组,我有另一个我编写的模块,它具有操作数组的功能。是否可以调用导入模块中的每个函数而无需对每个函数调用进行硬编码?意思是这样的:
#Some way I don't know of to get a list of function objects
listOfFunctions = module.getAllFunctions()
for function in listOfFunctions:
array.function()
我想这样做,所以每次向操作模块添加一个函数时都不需要更新我的主文件。
我找到了这些:
How to call a function from every module in a directory in Python?
Is it possible to list all functions in a module?
listing all functions in a python module
并且还发现列出python docs上的模块中的函数。
我可以想办法使用一些字符串操作和eval()
函数来做到这一点,但我觉得必须有一个更好,更pythonic的方式
答案 0 :(得分:1)
我想你想做这样的事情:
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()
答案 1 :(得分:1)
导入模块时,__dict__
属性包含模块中定义的所有内容(变量,类,函数等)。您可以迭代它并测试该项是否是函数。例如,可以通过检查__call__
属性来完成此操作:
listOfFunctions = [f for f in my_module.__dict__.values()
if hasattr(f,'__call__')]
然后,我们可以通过调用__call__
属性来调用列表中的每个函数:
for f in listOfFunctions:
f.__call__()
但要小心!字典没有保证的顺序。函数将以稍微随机的顺序调用。如果订单很重要,您可能希望使用强制执行此订单的命名方案(fun01_do_something,fun02_do_something等)并首先对字典的键进行排序。