获取Python包的所有函数

9 浏览
0 Comments

获取Python包的所有函数

我有一个多模块的Python包,其中有一个文件包含类MyClass,还有几个文件包含函数(一个文件可以包含多个函数)。\n我尝试获取这个包中的所有函数。\n首先,使用以下代码:\n

modules = []
for importer, module, ispkg in pkgutil.iter_modules(package.__path__):
    modules.extend(module)

\n但是我只得到了模块的名称,而不是模块对象。\n当我尝试使用inspect.getmembers(module, inspect.isfunction)获取这些模块的函数时,当然得到了一个空集合。\n那么,我如何才能从包中获取所有模块对象以进一步获取函数呢?\n是否存在更简单的方法来获取多文件包中的所有函数?\nP.S. 我需要的是确切的function对象,而不仅仅是它们的名称。\n编辑。\n

    \n

  1. dir(package)只给出了内置变量的列表:\n[\'__builtins__\', \'__doc__\', \'__file__\', \'__name__\', \'__package__\', \'__path__\']
  2. \n

  3. inspect.getmembers(package, inspect.isfunction)也给出了一个空列表,以及我上面描述的每个module的相同代码。
  4. \n

  5. dir(module)给出了可用于str对象的所有方法的名称列表(因为iter_modules()只给出了模块的名称)。
  6. \n

  7. AST...你确定没有更简单的解决方案吗?
  8. \n

0
0 Comments

问题的原因是在尝试获取Python包的所有函数时,由于无法导入子模块而导致出错。解决方法是在获取子模块之前先加载父模块。

具体的解决方法是使用下面的代码:

for importer, module, ispkg in pkgutil.iter_modules(package.__path__):
    __import__(package.__name__ + '.' + module)
    module_obj = sys.modules[package.__name__ + '.' + module]
    functions = [func for func in dir(module_obj) if callable(getattr(module_obj, func))]
    print(functions)

这段代码会遍历指定包的所有子模块,然后通过动态导入的方式加载子模块,并获取子模块的对象。之后,通过遍历模块对象的属性,筛选出可调用的函数,并将它们打印出来。

通过这种方式,我们可以获取到Python包中所有子模块的函数列表。

0