我编写了一个程序,它创建和维护一个数组,我编写了另一个模块,它具有操作数组的功能。是否可以调用导入模块中的每个函数而不必对每个函数调用进行硬编码?意思是这样的:
#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式的方法。
在某些单元测试中,这看起来是一种非常脆弱的方法。如果这正是您所追求的,那么为什么不连接一个合法的单元测试框架呢?否则我不太明白你的意图。
@赛博,我不是为了测试而使用它,所以我不是在追求一个单元测试框架。如果有什么问题,我是否会对导入的模块中的实际函数运行单元测试,以确保这些函数正常工作?
我将在模块中创建一个列表,然后当我创建一个函数时,在函数的范围内,将它添加到列表中。这样,帮助器函数就不需要出现在列表中。然后getAllFunctions将返回列表。
导入模块时,__dict__属性包含模块中定义的所有内容(变量、类、函数等)。您可以对其进行迭代,并测试该项是否为函数。例如,可以通过检查__call__属性来完成:
listOfFunctions = [f for f in my_module.__dict__.values()
if hasattr(f,'__call__')]
然后,我们可以通过调用__call__属性来调用列表中的每个函数:
for f in listOfFunctions:
f.__call__()
但是要小心!这本词典没有保证的顺序。函数将以某种随机顺序调用。如果顺序很重要,您可能希望使用强制执行此顺序的命名方案(fun01-do-u-something、fun02-do-u-something等),并首先对字典的键进行排序。
这可能是我写过的最黑客的Python。小心踩踏。
我想你想做这样的事情:
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()