- 文档
- 开发工具
【免费下载链接】sphinx
The Sphinx documentation generator
导读
本文围绕 Sphinx 官方扩展sphinx.ext.autosummary(自 Sphinx 0.6 引入)展开,讲解如何为函数、方法、属性、类等 API 对象生成类似 Epydoc 的摘要列表,并利用这些摘要条目自动生成独立的 stub 文档页面。读完本文,你将掌握autosummary指令的全部选项、sphinx-autogen命令行工具的用法、自动生成 stub 页面的配置项(autosummary_generate等)、模板定制机制以及autolink智能引用角色的原理,并了解其与sphinx.ext.autodoc的底层协作方式。
为什么需要 autosummary
当你的 docstring 很长、很详细时,把每个对象单独放一个页面更便于阅读。autosummary 扩展把这一过程拆成两部分:
autosummary指令:生成摘要列表(表格),包含指向被文档化对象的链接,以及从它们 docstring 中抽取的简短摘要(首句)。- 同一个指令还会为列表中的条目生成简短的 "stub" 文件——默认只包含对应的
autodoc指令,但可以通过模板定制。
此外,sphinx-autogen脚本也可以在命令行上直接生成 stub 文件。
启用扩展
在conf.py的extensions列表中启用:
extensions = [ 'sphinx.ext.autodoc', # autosummary 依赖 autodoc 'sphinx.ext.autosummary', ]从源码看,setup()中会调用app.setup_extension('sphinx.ext.autodoc')以确保 autodoc 就绪(见 sphinx/ext/autosummary/init.py)。
autosummary 指令:生成摘要表格
在 reStructuredText 中使用.. autosummary::指令,列出需要摘要的对象名即可:
.. currentmodule:: sphinx .. autosummary:: environment.BuildEnvironment util.relative_uricurrentmodule提供了导入前缀(源码中通过get_import_prefixes_from_env读取env.ref_context中的py:module与py:class,见 sphinx/ext/autosummary/init.py)。指令会尝试导入这些名称,为每个条目抓取签名与 docstring 首句,生成两列表格(左列对象名+签名,右列摘要),并在 HTML 输出时把第一列改为不换行(autosummary_table_visit_html)。
指令选项
| 选项 | 作用 | 引入版本 |
|---|---|---|
:class: | 给表格附加 docutils class 属性(以空格分隔的类名列表) | 8.2 |
:toctree: | 让摘要表同时充当 toctree 条目,并触发 stub 页面生成;参数为输出目录名 | 0.6 |
:caption: | 为 toctree 添加标题 | 3.1 |
:signatures: | 控制签名的显示方式:long(默认)、short、none | 8.2 |
:nosignatures: | 不显示签名,等价于:signatures: none(未来将弃用) | 0.6 |
:template: | 指定自定义模板渲染所有条目 | 1.0 |
:recursive: | 递归生成模块与子包的文档 | 3.1 |
详细说明
:toctree: DIRNAME:让表格同时作为toctree条目,并向sphinx-autogen发出信号:为本指令列出的条目生成 stub 页。例如:
.. autosummary:: :toctree: generated sphinx.environment.BuildEnvironment sphinx.util.relative_uri不给参数时,输出放在包含该指令的同一目录。源码中Autosummary.run()会根据autosummary_filename_map映射文件名、拼接tree_prefix,构造隐藏的toctree节点(sphinx/ext/autosummary/init.py)。若 stub 文件不存在,会给出警告提示检查autosummary_generate设置。注意:不带:toctree:时使用:caption:会被忽略并告警。
:signatures::
long(默认):使用完整签名,但会被截断以保证"名称+签名"不超过一定长度(源码中max_item_chars = 50,经mangle_signature压缩,见 sphinx/ext/autosummary/init.py);short:有参数显示为(…),无参数显示为();none:完全不显示签名。
:nosignatures::自 8.2 起被:signatures: none取代,未来版本将移除。
:template: mytemplate.rst:使用templates_path下的mytemplate.rst为该指令所有条目生成页面(详见下文"定制模板")。
:recursive::对模块与子包递归生成文档:
.. autosummary:: :recursive: sphinx.environment.BuildEnvironment与 autodoc 事件钩子的协作
autosummary 会用与 autodoc 相同的autodoc-process-docstring与autodoc-process-signature事件预处理 docstring 与签名(见get_items中对_load_object_by_name的调用链,sphinx/ext/autosummary/init.py)。这意味着你在 autodoc 中注册的 docstring 处理逻辑同样作用于 autosummary 的摘要与签名。
sphinx-autogen:命令行生成 stub 页面
sphinx-autogen脚本用于为autosummary列表中的条目批量生成 stub 文档页:
$ sphinx-autogen -o generated *.rst该命令读取所有*.rst文件中带有:toctree:选项的 autosummary 表格,并在generated目录为所有被文档化条目生成 stub 页。默认生成的页面形如:
sphinx.util.relative_uri ======================== .. autofunction:: sphinx.util.relative_uri不给-o时,输出文件放在各:toctree:选项指定的目录。生成逻辑位于 sphinx/ext/autosummary/generate.py,其内部通过find_autosummary_in_files扫描源文件中的指令(支持autosummary_re、automodule_re、module_re、:toctree:、:template:、:recursive:等模式,见 sphinx/ext/autosummary/generate.py),并对新生成的 stub 文件递归处理(因为 stub 内可能还有 autosummary 指令)。
命令行选项
| 选项 | 说明 | 默认值 |
|---|---|---|
-o <outputdir> | 输出目录,不存在则创建;缺省时使用:toctree:值 | None |
-s <suffix>, --suffix <suffix> | 生成文件的默认后缀 | rst |
-t <templates>, --templates <templates> | 自定义模板目录 | None |
-i, --imported-members | 文档化导入的成员 | 关闭 |
-a, --respect-module-all | 仅文档化模块__all__中的成员 | 关闭 |
--remove-old | 删除输出目录中不再生成的旧文件 | 关闭 |
参数解析见get_parser()(sphinx/ext/autosummary/generate.py),-t会把自定义模板目录加入templates_path,-a会将autosummary_ignore_module_all置为False。
一个完整示例
假设目录结构:
docs ├── index.rst └── ... foobar ├── foo │ └── __init__.py └── bar ├── __init__.py └── baz └── __init__.pydocs/index.rst内容:
Modules ======= .. autosummary:: :toctree: modules foobar.foo foobar.bar foobar.bar.baz执行:
$ PYTHONPATH=. sphinx-autogen docs/index.rst将在docs下生成:
docs ├── index.rst └── modules ├── foobar.bar.rst ├── foobar.bar.baz.rst └── foobar.foo.rst每个文件包含对应的automodule等 autodoc 指令及其他信息。更完整的 manpage 文档见 doc/man/sphinx-autogen.rst。
构建时自动生成 stub 页面
如果不想每次手动运行sphinx-autogen,可以在conf.py中配置以下值(stub 生成由builder-inited事件触发的process_generate_options完成,见 sphinx/ext/autosummary/init.py):
autosummary_context
- 类型:
dict[str, Any],默认{}(3.1 引入) - 传入模板引擎上下文的值字典,供 stub 文件模板使用。
autosummary_context = {"project_name": "My Project"}autosummary_generate
- 类型:
bool或文档名列表,默认True(自 4.0 起默认启用) - 为
True时扫描所有文档中的 autosummary 指令并生成 stub 页;也可以给一个列表,仅对这些文档生成。 - 新文件放在各指令
:toctree:指定的目录中。 - 自 2.3 起与 autodoc 一致地发出
autodoc-skip-member事件。
# 只对指定文档生成 autosummary_generate = ['api/modules', 'api/functions']autosummary_generate_overwrite
- 类型:
bool,默认True(3.0 引入) - 为
True时用生成的 stub 覆盖已存在文件;源码中若新旧内容相同则跳过写入(sphinx/ext/autosummary/generate.py)。
autosummary_mock_imports
- 类型:
list[str],默认继承autodoc_mock_imports(2.0 引入) - 需要 mock 的模块列表。配置值默认取自
config.autodoc_mock_imports(见setup()中的 lambda 默认值)。
autosummary_mock_imports = ['some_unavailable_module']autosummary_imported_members
- 类型:
bool,默认False(2.1 引入) - 是否文档化模块中导入的类与函数。
- 4.4 起:若
autosummary_ignore_module_all为False,则对列在__all__中的成员忽略本设置。
autosummary_ignore_module_all
- 类型:
bool,默认True(4.4 引入) - 为
False且模块设置了__all__时,只文档化__all__中的成员。注意:导入的成员若在__all__中,无论autosummary_imported_members如何都会被文档化。要匹配from module import *的行为,将autosummary_ignore_module_all设为False、autosummary_imported_members设为True。源码中members_of()依据该配置决定返回dir(obj)还是__all__(sphinx/ext/autosummary/generate.py)。
autosummary_filename_map
- 类型:
dict[str, str],默认{}(3.2 引入) - 对象名到文件名的映射,用于规避大小写不敏感文件系统上名称冲突的问题(例如对象名仅大小写不同)。
autosummary_filename_map = { "MyModule.myfunc": "myfunc", }定制 stub 模板
从 1.0 起可以像定制 HTML Jinja 模板一样定制 stub 页面模板(sphinx.application.TemplateBridge不支持)。Sphinx 自带以下模板文件(位于 sphinx/ext/autosummary/templates/autosummary/):
base.rst—— 回退模板(内容即{{ fullname | escape | underline }}加.. auto{{ objtype }}:: {{ objname }})module.rst—— 模块模板(含 Module Attributes / Functions / Classes / Exceptions 及可选的递归 Modules 区块)class.rst—— 类模板(含automethod:: __init__、Methods、Attributes 区块)function.rst—— 函数模板attribute.rst—— 类属性模板method.rst—— 类方法模板
模板渲染使用SandboxedEnvironment,并注册了escape、e、underline过滤器(sphinx/ext/autosummary/generate.py);模板查找失败时会按template_name→autosummary/<type>.rst→autosummary/base.rst的顺序回退。
模板可用变量
| 变量 | 含义 |
|---|---|
name | 对象名(不含模块与类前缀) |
objname | 对象名(不含模块前缀) |
fullname | 完整对象名(含模块与类前缀) |
objtype | 对象类型:module、function、class、method、attribute、data、object、exception、newvarattribute、newtypedata、property |
module | 对象所属模块名 |
class | 对象所属类名(仅方法、属性可用) |
underline | 由len(full_name) * '='组成的字符串(推荐改用underline过滤器) |
members | 模块或类的全部成员名列表 |
inherited_members | 类继承成员名列表(1.8.0+,仅类) |
functions | 模块中"公开"函数名(不以_开头) |
classes | 模块中"公开"类名 |
exceptions | 模块中"公开"异常名 |
methods | 类中"公开"方法名 |
attributes | 类/模块的"公开"属性名(3.1 起支持模块属性) |
modules | 包中"公开"子模块名(仅包且开启recursive时) |
模板可用过滤器
escape(s):转义 RST 特殊字符(如防止*变成加粗),替换 Jinja 内置的 HTML 版escape过滤器。underline(s, line='='):为文本添加标题下划线。
页面标题推荐写法:
{{ fullname | escape | underline }}通过:template:指定自定义模板:
.. autosummary:: :template: mytemplate.rst sphinx.environment.BuildEnvironment注意:autosummary_context配置字典会注入模板上下文(见generate_autosummary_content中ns.update(context),sphinx/ext/autosummary/generate.py)。另外,stub 页面里也可以再使用autosummary指令,这些指令同样会参与后续的 stub 生成。官方提示:如果花大量时间定制 stub 模板,或许更应该直接编写自定义的叙事性文档(narrative documentation)。
autolink:智能引用角色
:autolink:角色在名称能被解析为 Python 对象时充当:py:obj:,否则退化为简单强调(斜体)。其实现(AutoLink.run,见 sphinx/ext/autosummary/init.py)先委托 Python 域的obj角色创建引用节点,再尝试用import_by_name导入;导入失败则把节点替换为emphasis。
已知设计缺陷
- 多个同名对象时可能解析到错误对象;
- 对象拼写错误或改名导致找不到时,会静默失败(不报错),这有时是反期望的行为。
有人把default_role配成autolink,让默认解释文本角色(`content`)实现"智能"引用:
default_role = 'autolink'底层原理:导入与摘要抽取
理解 autosummary 的 import 逻辑有助于排查问题:import_by_name会按prefixes依次尝试(前缀来自currentmodule/currentclass上下文),并检测"当前模块前缀重复"的循环引用并给出警告(sphinx/ext/autosummary/init.py)。实例属性(如self.attr、dataclass 注解属性)通过import_ivar_by_name结合ModuleAnalyzer的attr_docs与annotations识别。
摘要抽取由extract_summary完成:取 docstring 的第一个段落(stanza),跳过开头空行、遇到空行停止;若以章节标题开头则用标题文本;否则按句号切分寻找"第一句",并避免破坏内联标记(如e.g.、i.e.、et al.、vs.等已知缩写),最后去掉尾部::字面量标记(sphinx/ext/autosummary/init.py)。
测试佐证
仓库测试覆盖了自动生成内容、覆盖策略、递归、导入成员等关键行为,可作为理解预期行为的参考:
- tests/test_ext_autosummary/test_ext_autosummary.py:
test_autosummary_generate_content_for_module(模块内容生成)、test_autosummary_generate_content_for_module___all__(__all__语义)、test_autosummary_generate(整体生成)、test_autosummary_generate_overwrite1/2(覆盖行为)、test_autosummary_recursive(递归)、test_autosummary_imported_members(导入成员); - tests/test_ext_autosummary/test_ext_autosummary_imports.py:导入前缀(
currentmodule)解析。
与官方文档其他章节的关系
- 启用扩展与整体配置可参考 doc/usage/configuration.rst;
sphinx-autogen的 manpage 见 doc/man/sphinx-autogen.rst;- 在自动化生成 API 文档的实战流程中,autosummary 常与 autodoc 配合,参见 doc/tutorial/automatic-doc-generation.rst;
- 本扩展自身的官方用法文档位于 doc/usage/extensions/autosummary.rst。
小结
autosummary 的完整工作流可以总结为一条链路:autosummary指令负责"读取"(导入对象、抽取签名与摘要、生成表格)→:toctree:负责"登记"(把 stub 页挂入目录树)→sphinx-autogen或autosummary_generate负责"产出"(依据内置或自定义 Jinja 模板生成 stub 页)→ 构建时再由 stub 页中的autodoc指令完成最终渲染。结合autolink智能角色,它构成了 Sphinx 项目 API 文档"摘要页 + 详情页"体系的核心设施。
- 文档
- 开发工具
【免费下载链接】sphinx
The Sphinx documentation generator
相关推荐
Sphinx 自动文档生成指南:用 autodoc 与 autosummary 从源码生成 API 文档
Sphinx 自动文档生成指南:用 autodoc 与 autosummary 从源码生成 API 文档 本文是 Sphinx 官方教程"从代码自动生成文档"一
文档开发工具Sphinx autosummary 模板解析:NVIDIA cuML API 文档的自动生成机制
Sphinx autosummary 模板解析:NVIDIA cuML API 文档的自动生成机制 cuML 的官方 API 参考文档并非手写,而是由 Sphi
机器学习高性能计算App-Store-Connect-CLI agent-native ad hoc 分发:从 Xcode 归档到可验证 OTA 安装的全链路设计
App Store Connect CLI agent native ad hoc 分发:从 Xcode 归档到可验证 OTA 安装的全链路设计 本篇技术指南围
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考