ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sphinx 3.4 版本深度解析:autodoc 签名与类型注解增强、linkcheck 限速机制及弃用 API 迁移指南

Sphinx 3.4 版本深度解析:autodoc 签名与类型注解增强、linkcheck 限速机制及弃用 API 迁移指南 文档开发工具【免费下载链接】sphinxThe Sphinx documentation generator项目地址https://gitcode.com/gh_mirrors/sp/sphinx点击查看免费下载Sphinx 3.4 是 2020 年 12 月至 2021 年 1 月间发布的一个重要功能版本聚焦于 autodoc 扩展在类型注解、__slots__、泛型与 PEP-526 场景下的大量修复与增强同时为 napoleon、linkcheck 引入新配置项并为交叉引用失败警告新增了可编程拦截的事件。本文以官方变更记录 doc/changes/3.4.rst 为主体结合仓库源码与测试用例逐条剖析 3.4.0 的功能、弃用项与不兼容变更以及 3.4.13.4.3 三个补丁版本的修复内容帮助你在升级或迁移到 3.4 系时提前规避兼容性风险。版本概览与发布节奏Sphinx 3.4 主版本于 2020 年 12 月 20 日发布3.4.0随后在一个月内连续推出三个补丁版本形成完整的 3.4 系列版本发布日期定位3.4.02020-12-20主版本新功能、弃用项、不兼容变更与大量修复3.4.12020-12-25补丁autodoc 类型注解与__slots__相关问题3.4.22021-01-04补丁mock 类继承、事件触发范围问题3.4.32021-01-08补丁hasattr()异常场景的文档生成失败从内容分布看本次迭代的主战场在sphinx/ext/autodoc围绕类型注解forward reference、TypeVar、GenericAlias、NewType、PEP-526 变量、__slots__属性、__signature__与装饰器类的签名解析3.4.0 一次性修复了十余个 autodoc 问题。其余变更分散在 napoleon、linkcheck、i18n、graphviz、LaTeX、C 域与 std 域等模块。不兼容变更装饰器类的构造函数签名3.4.0 引入了一项行为不兼容变更issue #8105对于被装饰器修饰的类autodoc 现在展示的是类构造函数本身的签名而不再是装饰器包装后的签名。# 此前行为展示 decorator(*args, **kwargs) 的签名 # 3.4.0 起展示 __init__ 的真实签名 some_decorator class Foo: def __init__(self, a: int, b: str x) - None: ...该变更同时修复了两个相关 bug装饰器类构造函数签名不正确以及__signature__不被尊重#7613。如果你的文档中大量使用了带装饰器的类升级后请检查生成的签名是否符合预期——这是 3.4 系列唯一需要人工关注的行为变化。新增功能详解3.4.0autodocautodoc-skip-member事件控制__all__过滤此前模块中未列入__all__的成员是否被文档化由 autodoc 内部逻辑决定。3.4.0 起issue #8119你可以通过autodoc-skip-member事件自行裁决。该事件的注册与触发分别位于 sphinx/ext/autodoc/init.py 与 sphinx/ext/autodoc/_dynamic/_member_finder.py处理函数返回True表示跳过、返回False表示纳入文档、返回None则交给默认逻辑。# conf.py def skip_non_public(app, what, name, obj, skip, options): if name.startswith(_) and not name.startswith(__): return True return skip def setup(app): app.connect(autodoc-skip-member, skip_non_public)autodoc:no-value:选项抑制默认值输出为autoattribute与autodata指令新增:no-value:选项issue #8209用于隐藏变量默认值——在文档化敏感常量或环境相关配置时尤为实用。该选项在 sphinx/ext/autodoc/directive.py 与 sphinx/ext/autodoc/_directive_options.py 中登记渲染时由 sphinx/ext/autodoc/_renderer.py 依据options.no_value决定是否输出取值测试见 tests/test_ext_autodoc/test_ext_autodoc_autoattribute.py。.. autodata:: API_KEY :no-value:autodoc签名与类型注解的系列增强Optional[t]自动推导当函数/方法的默认值为None时自动将参数注解改写为Optional[t]无需手工标注。typing.NewType支持#8460自定义类型可以被正确识别与渲染同时修复了autodata/autoattribute不显示 TypeVar 类型信息的问题。泛型类参数展示#8219在 Python 3.7 及以上、且开启show-inheritance时若父类是泛型类子类的泛型参数将正确显示。Documenter.config快捷属性新增对配置对象的便捷访问入口自定义 Documenter 时无需再经self.env.config间接获取。napoleonnapoleon_attr_annotations与 numpydoc Receives 节napoleon_attr_annotationsissue #8285是 3.4.0 为 napoleon 引入的新配置项当类属性的 docstring 未写出类型、而源码中存在类型注解时自动合并注解作为类型信息。该配置在 sphinx/ext/napoleon/init.py 中声明默认值为True类型为bool重建级别为env修改后需触发环境重建才生效其消费逻辑位于 sphinx/ext/napoleon/docstring.py配套测试见 tests/test_ext_napoleon/test_ext_napoleon_docstring.py。# conf.py napoleon_attr_annotations True # 默认即 Trueclass Service: 示例类。 Attributes: retries: 失败重试次数。 retries: int 3 # 类型 int 来自源码注解此外napoleon 还支持了 numpydoc 风格的Receives节issue #8236使 Google/Numpy 风格 docstring 的解析覆盖面更完整。新事件warn-missing-reference自定义交叉引用失败告警issue #6914 引入了一个新事件warn-missing-reference用于在交叉引用解析失败时定制告警内容。其定义位于 sphinx/events.py由 sphinx/transforms/post_transforms/init.py 中的warn_missing_reference()在发出告警前通过emit_firstresult触发只要任一监听器返回非空值真值默认告警即被抑制。std 域在 sphinx/domains/std/init.py 中注册了默认实现用于为:doc:、:ref:等目标生成更精确的提示信息。# conf.py —— 对特定目标静默告警 def silent(app, domain, node): if node[reftarget] undocumented_target: return True def setup(app): app.connect(warn-missing-reference, silent)同时:ref:引用解析失败时的告警信息被增强为更详细的形式包含目标与上下文便于快速定位失效链接。linkcheck限速Rate Limit处理3.4.0 为 linkcheck builder 引入了对服务器限速的完整支持issue #6629并新增配置项linkcheck_rate_limit_timeout。该配置在 sphinx/builders/linkcheck.py 中注册默认值为300.0秒类型为float/int含义是单个站点按 netloc 维度等待重试的最大退避时间上限。底层实现集中在 limit_rate()优先读取响应的Retry-After头支持整数秒或 HTTP-date 两种格式若缺失则对同一站点的上次等待时间做指数退避delay 2.0 * last_wait_time但不超过linkcheck_rate_limit_timeout退避超过上限时直接放弃该链接。每个站点的限速状态保存在rate_limits字典中链接成功后立即清除。相关测试覆盖了linkcheck_rate_limit_timeout为0.0、90、90.0等取值见 tests/test_builders/test_build_linkcheck.py。# conf.py linkcheck_rate_limit_timeout 300.0 # 默认值按需调小以加快构建该功能配合 #8131 的修复HEAD 请求触发 Too Many Redirects 时改用 GET显著提升了面对 GitHub 等带限速策略站点的链接检查稳定性。弃用 API 清单与迁移建议3.4.0 对一批内部接口标注了弃用Deprecated升级后相关代码会收到弃用警告建议尽早迁移弃用对象位置/替代方案signature()的follow_wrapped参数sphinx.util.inspect.signature()改用follow_wrapped之外的签名解析路径Documenter.add_content()的no_docstring参数sphinx.ext.autodoc.Documenter.add_content()Documenter.get_object_members()sphinx.ext.autodoc.DocumenterDataDeclarationDocumentersphinx.ext.autodoc使用通用数据声明文档器GenericAliasDocumentersphinx.ext.autodoc泛型别名文档器被并入通用逻辑InstanceAttributeDocumentersphinx.ext.autodoc实例属性文档器SlotsAttributeDocumentersphinx.ext.autodoc__slots__属性文档器TypeVarDocumentersphinx.ext.autodocTypeVar 文档器importer._getannotations()sphinx.ext.autodoc.importer内部函数importer._getmro()sphinx.ext.autodoc.importer内部函数ModuleAnalyzer.parse()sphinx.pycode.ModuleAnalyzerosutil.movefile()sphinx.util.osutilis_ssl_error()sphinx.util.requestsSSL 错误判断这批弃用项多为 autodoc 内部 API普通用户一般不会直接触及只有当你自定义 Documenter 或深度扩展 autodoc 时才需要关注。它们的被弃用与 3.4.0 大量重构 autodoc 成员收集逻辑如新增_dynamic与_legacy_class_based目录结构直接相关后续主版本中将被移除。3.4.0 修复的 Bug 全览除上述新功能外3.4.0 修复了 26 个问题绝大多数集中在 autodoc 的类型注解与属性文档化autodoc 类与签名#7613不尊重类的__signature__#4606继承方法告警位置不正确#8105装饰器类构造函数签名不正确#8434autodoc_type_aliases对变量与属性不生效#8522可能意外调用__bool__方法收集成员时误做真值判断#8493类别名中对内建类型的引用失效PEP-526 与__slots__属性文档化#8443autodata无法为 PEP-526 类型注解变量生成文档#8443autoattribute无法为 PEP-526 未初始化变量生成文档#8480autoattribute无法为__slots__属性生成文档#8545__slots__属性即使带 docstring 也不被文档化#8503类属性为GenericAlias时无法正确文档化#8534别名类中被注释commented的属性无法文档化类型注解相关#8452autodoc_type_aliases在autodoc_typehints description时不生效#8541autodoc_type_aliases对实例属性注解不生效#8067父类实例变量的type_comment注解不显示#741inherited-members对父类实例属性不生效这一批修复直接支撑了 3.4.0 的卖点基于 PEP-526 注解的现代 Python 代码可以被 autodoc 完整、准确地文档化。其他模块#8477autosummary 模板含多字节字符时生成非 UTF-8 的 reST 文件#8501autosummary 摘要提取在 el at. 后被意外截断#8524文档名为 index 时生成错误的url_root#8419HTML 搜索在非搜索页面不再加载language_data.js#8549i18n 中-D gettext_compact0失效#8454graphviz 的 graph/digraph 指令布局选项不生效#8437make clean在 BUILDDIR 为空时存在危险#8365py 域:type:/:rtype:产生错误的歧义类查找告警#8352std 域无法解析以方括号开头的选项#8519LaTeX 在 seealso 中间产生分页#8520C 域修复AliasNode的复制补丁版本修复要点3.4.1 ~ 3.4.3三个补丁版本延续了 autodoc 主题同时覆盖 linkcheck 等外围模块3.4.12020-12-25#8559前向引用forward-reference类型注解触发AttributeError#8568检查__slots__属性时触发TypeError#8567实例属性被错误地添加到父类#8566autodoc-process-docstring事件被意外派发到别名类#8583通过__eq__进行不必要的对象比较#8565linkcheck 中链接元组不可比较时PriorityQueue崩溃3.4.22021-01-04#8164继承自 mock 类的类不被文档化#8602autodoc-process-docstring事件被意外派发到非 datadescriptor#8616向 autoclass 传入非类对象时抛出AttributeError3.4.32021-01-08#8655目标模块中存在hasattr()会抛异常的对象时无法生成文档其中 #8655 的修复对自动化文档构建环境意义重大部分库尤其是使用__getattr__魔法或动态属性的模块在hasattr()探测时会抛出异常3.4.3 确保这种场景下 autodoc 仍能完成文档生成而不中断构建。升级建议与验证清单综合 3.4 系列的变更记录升级到该版本时建议依次核对签名变化检查文档中被装饰器修饰的类确认构造函数签名展示符合预期唯一不兼容变更issue #8105。弃用告警构建日志中出现弃用警告时对照上文表格定位到具体调用方并迁移若你自定义了 Documenter重点排查被弃用的五个 Documenter 类。类型注解渲染启用 PEP-526 注解、__slots__、泛型与 NewType 的项目可先用tests/test_ext_autodoc/与tests/test_ext_napoleon/下的用例自检渲染结果。linkcheck 限速若链接检查频繁命中服务器限速可通过linkcheck_rate_limit_timeout调整最大退避时间默认为 300 秒。引用告警策略通过warn-missing-reference事件对已知失效引用做定制化处理替代全局nitpicky告警的一刀切。从源码布局看3.4 系列是 autodoc 内部结构重构的过渡版本成员收集逻辑开始向_dynamic与_legacy_class_based双轨演进一批内部 API 随之进入弃用通道。理解这份变更记录既有助于平稳完成 3.4 升级也为后续 4.x/5.x 的 autodoc 能力演进打下了认知基础。赞分享文档开发工具【免费下载链接】sphinxThe Sphinx documentation generator项目地址https://gitcode.com/gh_mirrors/sp/sphinx点击查看免费下载相关推荐Sphinx 4.1 版本特性深度解析autodoc 类型体系、linkcheck 增强与并行构建优化Sphinx 4.1 版本特性深度解析autodoc 类型体系、linkcheck 增强与并行构建优化 Sphinx 4.1 是 Sphinx 文档生成器在文档开发工具Sphinx 9.0 发布深度解读autodoc 重写、MathJax v4、linkcheck 增强与兼容性迁移指南Sphinx 9.0 发布深度解读autodoc 重写、MathJax v4、linkcheck 增强与兼容性迁移指南 本篇技术指南围绕 Sphinx 文档生文档开发工具Sphinx 7.1 版本特性深度解析签名换行、PEP 695 泛型支持与 linkcheck 增强Sphinx 7.1 版本特性深度解析签名换行、PEP 695 泛型支持与 linkcheck 增强 导读 Sphinx 7.1 是 Sphinx 文档生成器文档开发工具上一篇docToolchain实战教程从Markdown到Confluence的完整发布流程下一篇react-native-router-flux v3 声明式路由实战指南场景配置、Actions 导航调用与高级路由能力全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表