带有toctree的autosummary也列出导入的成员
我在用Sphinx和autosummary来生成一个Python软件的文档。这个工具运行得不错,但生成的.rst文件里也列出了那些被导入的函数和类,这不是我想要的效果。
比如说,有一个包叫“packageex”,它的文档字符串是:
"""
Package Example (:mod:`packageex`)
==================================
.. currentmodule:: packageex
.. autosummary::
:toctree:
module0
module1
"""
这样会生成一个名为packageex.module0.rst的文件,里面包含了:
Module0 (:mod:`packageex.module0`)
=================================
.. currentmodule:: packageex.module0
.. rubric:: Functions
.. autosummary::
f0
f1
f2_imported
f3_imported
.. rubric:: Classes
.. autosummary::
Class0
ClassImported
有没有办法只列出模块中定义的函数和类,而不包括那些导入的呢?
在autodoc的文档中(http://sphinx-doc.org/latest/ext/autodoc.html),提到“在一个automodule指令中,如果设置了members选项,只有那些__module__
属性等于automodule给出的模块名的模块成员会被记录。这是为了防止记录导入的类或函数。如果你想要记录所有可用的成员,可以设置imported-members选项。需要注意的是,导入模块的属性不会被记录,因为属性的文档是通过解析当前模块的源文件来发现的。”那么,使用autosummary时,能否实现同样的效果呢?
1 个回答
5
正如mzjn提到的,扩展功能autosummary似乎有一种已知的奇怪行为。为了实现我想要的效果(也就是不列出导入的对象),我只是修改了函数get_members
(在sphinx.ext.autosummary.generate的第166行),修改的方式如下:
def get_members(obj, typ, include_public=[], imported=False):
items = []
for name in dir(obj):
try:
obj_name = safe_getattr(obj, name)
documenter = get_documenter(obj_name, obj)
except AttributeError:
continue
if documenter.objtype == typ:
try:
cond = (
imported or
obj_name.__module__ == obj.__name__
)
except AttributeError:
cond = True
if cond:
items.append(name)
public = [x for x in items
if x in include_public or not x.startswith('_')]
return public, items