【发布时间】:2013-02-27 15:10:07
【问题描述】:
我正在尝试使用sphinx 记录一个python 包并成功生成了html 文件。我正在记录的包由一组*.py 文件组成,其中大多数包含一个类,其中几个文件是定义了函数的真正模块。我不需要公开每个类都在一个模块中的事实,因此我在__init__.py 文件中添加了合适的from 语句,例如
from base import Base
这样用户就可以使用import pkg 命令,而不必指定包含该类的模块:
import pkg
class MyBase(pkg.Base): # instead of pkg.base.Base ...
...
问题在于 sphinx 坚持将类记录为 pkg.base.Base。我试图在conf.py 中设置add_module_names = False。然而,这会导致 sphinx 将类显示为简单的 Base 而不是 pkg.Base。此外,这也破坏了两个 是 模块的 *.py 文件的文档。
如何让sphinx 将类显示为pkg.Base?
以及如何为每个*.py 文件选择性地设置add_module_names 指令?
【问题讨论】:
-
不要那样做。 Sphinx 正确地 告诉用户类在哪里定义,而不是在哪里导入。如果你在两个不同的模块中导入
Base类,Sphinx 怎么知道你想使用哪个名字?如果您不希望用户知道您定义类的模块,那么您可能应该将其设为私有(如果我没记错的话,它不会显示在生成的文件中)。 -
@Bakuriu - 不确定我是否理解您的评论。澄清一下,每个类都在一个单独的文件中的唯一原因是为了更容易管理源代码控制。类的使用只需要包名和类名,而不需要模块名(这是多余的)。文档应该描述用法而不是定义,你不觉得吗?如何将模块名称设为私有?
-
那有什么问题呢?只需使用
add_module_names = False并将文档放在正确的页面中。用户将看到在引用模块pkg的页面中有一个文档类Base,这很好。pkg.module.Baseonly 指的是定义类的模块,而不是您“使用它”的模块(这是未明确定义的)。如果你想要一个肮脏的解决方案来获得你想要的输出,那么在__init__创建一个假子类:class TheClass(pkg.module.TheClass): pass,继承文档。
标签: python python-sphinx