列出模块中的所有功能

时间:2019-03-14 09:25:42

标签: python python-3.x

我想在一个模块中列出所有功能,但我陷入了困境。 我只得到__init__.py中的函数  但不是包中的所有功能。这是我已经准备好的代码:

import package
functions = []
for i in dir(package):
    functions.append(i)
print(functions)

所以现在我得到__init__.py中所有功能的列表,但没有整个包的列表。如何获得“包装”中的所有功能? 我想这样得到它:

import package
functions = []
for i in dir(package):
    #here like adding function and then make package function.other_package
print(functions)

有人可以帮助我吗?

  

这不是重复的,因为我不需要文档,而只是打包中所有文件的所有功能

1 个答案:

答案 0 :(得分:1)

确切地定义package的含义有些棘手,因此我仅假设非常基本的内容:您有一个假定为包根的目录,并且直接有许多python文件在其中或更深的嵌套中,您假定它是程序包的一部分。可能是这样的:

# package foo
foo
├── bar.py               # has a function "bar"
├── __init__.py          # has a function "foo" 
└── baz
    ├── qux.py           # has functions "baz" and "qux"
    └── __init__.py

您期望得到这样的结果:

foo/bar.py: [bar]
foo/__init__.py: [foo]
foo/baz/qux.py: [qux, baz]
foo/baz/__init__.py: []

如果没有做出其他假设,则了解程序包包含哪些功能的唯一方法是要求python本身编译文件并显示其内容:

import os
import inspect
import typing

# find all python files below a certain folder
files = []
for (dirpath, dirnames, filenames) in os.walk('path/to/a/package/foo'):
    for filename in filenames:
        if filename.endswith('.py'):
            files.append(os.sep.join([dirpath, filename]))

for f in files:
    # turn the files into code objects and find declared constants
    functions = []
    code_obj = compile(open(f).read(), f, 'exec')
    members = dict(inspect.getmembers(code_obj))
    for idx in range(len(members['co_consts'])//2):
        val = members['co_consts'][idx * 2]
        name = members['co_consts'][idx * 2 + 1]
        # suboptimal: this check also allows lambdas and classes 
        if isinstance(val, types.CodeType):
            functions.append(name)
    print(f'{f}: {functions}')

此片段为我打印出上述结果。据我所知,没有办法询问软件包的所有功能,包括所有功能,不仅是那些它愿意公开的功能。


另请参阅this QAthis post,以了解从代码对象中提取函数的替代方式和更准确(尽管更复杂)。