我想在一个模块中列出所有功能,但我陷入了困境。
我只得到__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)
有人可以帮助我吗?
这不是重复的,因为我不需要文档,而只是打包中所有文件的所有功能
答案 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}')
此片段为我打印出上述结果。据我所知,没有办法询问软件包的所有功能,包括所有功能,不仅是那些它愿意公开的功能。