python - 通过在部分中附加各种注释来混合代码文档和代码?
问题描述
考虑以下最小示例:
docs/index.rst
* :ref:`modindex`
docs/modules.rst
exampleproject
==============
.. toctree::
:maxdepth: 4
exampleproject
.. print_notes_attached_to_topic::
:topic: notes_about_someproblem
docs/conf.py
extensions = ['sphinx.ext.autodoc']
docs/exampleproject.rst
exampleproject package
======================
Module contents
---------------
.. automodule:: exampleproject
:members:
:undoc-members:
:show-inheritance:
exampleproject/__init__.py
def example_fun():
"""
This is the docstring I'll be discussing.
.. attach_to_topic::
:topic: notes_about_someproblem
Grass is green.
"""
pass
def other_example_fun():
"""
This is the second docstring I'll be discussing.
.. attach_to_topic::
:topic: notes_about_someproblem
Sky is blue.
"""
pass
我知道sphinx.ext.autodoc
可以提取文档字符串并将它们放在 docs/exampleproject.rst 中。我的问题是:有没有办法自动将某些部分附加到特定文档?理想情况下,我想将尽可能多的文档放在源代码中,然后使用文档的源文件将这些信息按线性顺序排列。就像是:
- 在 example_fun 文档字符串中
exampleproject/__init__.py
,编写表达式“向名为 building_methods 的部分/主题添加注释,说‘在运行项目之前,做 xyz’” - 在 index.rst 中,“列出与名为 building_methods 的部分/主题相关的所有注释”。
与自动文档的比较
我知道 sphinxsphinx.ext.autodoc
可以处理应用程序的文档字符串。问题是 autodoc 强制文档的某种“代码优先”/“API 优先”结构。我正在寻找一种解决方案,它可以让我在代码中保留尽可能多的文档,然后将此文档转换为线性文档,其中包含从示例attach_to_topic
指令之类的内容中提取的某些主题的数据。
狮身人面像有可能吗?
解决方案
我同意 mzjn 的观点,即您的示例并没有给出太多内容,但我会冒险进行一些猜测:
附加到 apidoc 存根页面
和存根文件由sphinx-apidocdocs/exampleproject.rst
自动生成。然后您手动将您自己的内容(指令)附加到这些内容中。docs/modules.rst
.. print_notes_attached_to_topic::
这将是有问题的,因为每次sphinx-apidoc
提取 Python 文档字符串以重建其存根页面时,您的块都会被覆盖/丢失。我永远不会尝试将我自己的内容混合到由扩展程序拥有/生成的页面中 - 它们可以并排放置,但可以分开,例如将所有指令放在一个./docs/all-my-print-notes.rst
页面中。
也就是说,如果你想让你的生活复杂化,那就进行后期处理。修改 Sphinx生成文件以检测存根页面更改并触发 Bash 或 Python 脚本,最终将您的自定义内容扑通一声。如果间接完成,则最干净——一个包含指令进入存根页面,以便您的自定义内容可以在其他地方保持隔离。
和(in & )的Jinja2 模板提供有限的自定义,但实际上只适用于布局和静态内容。autodoc
autosummary
./site-packages/sphinx/templates/apidoc/
./site-packages/sphinx/ext/autosummary/templates/
你的狮身人面像扩展
您想要的功能听起来很像sphinx.ext.todo。您的.. attach_to_topic::
指令分散在整个 Python 模块文档字符串(相当于.. todo::
指令)中,并且您的.. print_notes_attached_to_topic::
指令将这些块收集成“线性顺序”(相当于.. todolist::
)。
幸运的是,关于创建扩展的文档给出了这个例子,你可以根据自己的需要进行调整。您的扩展将有一个额外的功能,因为它提供了一个:topic:
选项来标记/分类每个.. todo::
项目,并限制每个.. todolist::
排序规则的范围。
推荐阅读
- android - 我在哪里可以找到 ObjectBox 中的 Data.mdb?
- javascript - 如何调试 Angular 错误 - 错误:未捕获(承诺中):TypeError:无法读取 null 的属性“数据”
- php - Laravel 5.8 迁移中的外键未知(MEDIUMINT?)问题
- javascript - 如何在JS中存储常用费用数据
- python - 采用 1 个参数 x 或另一个的函数
- c - 需要帮助从文件中读取并将内容存储到二维数组中
- php - 如何加快 MySQL UPDATE 查询以获得更好的每秒性能
- laravel - Laravel 支持的搜索无法正常工作
- javascript - 我可以在 CSS 属性中使用全局变量吗
- database-design - EER 图 - 如何表示主管可以执行其他角色的所有任务