Getting all functions of python package
我有一个多模块python包,它有一个类为MyClass的文件,很少有具有函数的文件(一个文件可以包含多个函数)。
我试图获取这个包中的所有函数。
首先,使用以下方法:
1 2 3
| modules = []
for importer, module, ispkg in pkgutil.iter_modules(package.__path__):
modules.extend(module) |
但我只有模块名,没有模块对象。
当我试图使用inspect.getmembers(module, inspect.isfunction)获取这些模块的函数时,我当然得到了一个空的集合。
那么,如何从包中获取所有模块对象以进一步获取函数呢?
是否存在从多文件包获取所有函数的更简单方法?
另外,我需要的正是function对象,而不仅仅是它们的名字。
编辑。
dir(package)只提供了内置变量:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
inspect.getmembers(package, inspect.infunction)给出一个空的列出每个module的相同代码,如上所述。
dir(module)给了我所有可用于str对象(因为,iter_modules()只给出了模块)。
AST…你确定没有更简单的解决方案吗?
- stackoverflow.com/questions/139180/…,stackoverflow.com/questions/4040620/……?
- @Rbaleksandar,我看到这些帖子试图找到解决方案。但他们中没有一个对我不起作用(见我的编辑)。
- 这个问题不重复,因为这里发布的所有答案对我都不起作用(首先,我有一个多模块包,其次,我需要获取函数对象,而不仅仅是名称)。
- 这个答案说:"all_functions是一个元组列表,其中第一个元素是函数的名称,第二个元素是函数本身。"
- 您可能可以执行类似于此答案中所示的操作,动态导入包中的所有模块-更改末尾附近将对象添加到全局命名空间的部分,以迭代在每个子模块中查找函数对象的内容。
- @Rbaleksandar,好的,但是它只适用于模块,而不适用于包(参见post的一部分,从…以及我的编辑编号2)。
- @维克尔·埃多克西为我工作。你肯定做错了什么。你能发布完全可复制的代码吗?
- @Andrey,我的文章中的第一个代码片段给出了strs的列表。因此,dir()给出了str类型可用的名称列表。如果dir()适用于您的多模块包,您是如何获得module对象的包?
试试这个:
1 2
| for importer, module, ispkg in pkgutil.iter_modules(package.__path__):
print dir(__import__(module)) |
- 谢谢,但不管用。没有父模块我不能导入子模块,所以如果运行您的代码片段,我得到:ImportError: No module named sub_module。我的解决方法如下:print dir(__import__(package.__name__ + '.' + module))。但是,我再次得到了一个str的列表,但是需要module对象或一些类似的对象,从中我将得到函数。
- @然后首先加载父模块。