如何让pydoc将dlprim子模块内容整合到主模块命名空间的文档中
解决pydoc生成dlprim模块文档时子模块成员不展示的问题
pydoc默认过滤导入的外部成员的核心逻辑是:只有成员的
__module__属性等于当前模块名,或者出现在当前模块的__all__列表中,才会被计入当前模块的文档。你原来的写法只是导入了成员,但它们的__module__还是指向子模块,所以pydoc不会把它们算在dlprim主模块的文档里。
方法1:修改__init__.py适配pydoc规则(无需换工具)
修改dlprim目录下的__init__.py内容如下:
from ._pydlprim import * from .netconfig import * import sys # 1. 显式声明主模块公开的所有成员,过滤私有变量 __all__ = [name for name in dir() if not name.startswith('_')] # 2. 修正成员归属的模块标识,让pydoc判定为属于dlprim主模块 current_module = sys.modules[__name__] for name in __all__: obj = getattr(current_module, name) # 仅修改类、函数这类可标识模块的成员 if hasattr(obj, '__module__') and obj.__module__ in ('dlprim._pydlprim', 'dlprim.netconfig'): obj.__module__ = __name__ # 可选:隐藏子模块引用,避免它们出现在主模块的成员列表中 del _pydlprim, netconfig, sys
修改完成后直接执行pydoc -w dlprim,即可生成包含所有类、函数的单文件文档,所有成员都会归属到dlprim主模块的命名空间下。
方法2:使用更灵活的替代文档生成工具
如果不想修改项目源码,可以换用对跨模块导入兼容性更好的文档工具:
- pdoc:默认支持自动识别
__init__.py中导入的公开成员,直接执行pdoc --html dlprim -o ./docs即可生成结构清晰的HTML文档,所有子模块导入的成员都会默认展示在dlprim主模块页面。 - Sphinx:适合需要专业文档结构的场景,配合autodoc扩展可以自定义要展示的API成员,支持将不同子模块的成员汇总到同一主模块文档页面,还可搭配自定义主题、教程说明等内容。
特殊情况处理
如果Boost.Python生成的_pydlprim模块成员没有内置__module__属性,可以手动赋值:
# 比如要把_pydlprim里的Tensor类归属到dlprim主模块 from ._pydlprim import Tensor Tensor.__module__ = __name__
内容的提问来源于stack exchange,提问作者Artyom
相关产品推荐
相关产品推荐

