我有这个类:
class Class:
pass
生成的文档(如果有必要,我使用了autodoc
扩展程序)如下:
从类 package.Class
基类: object
object
继承并不是对读者有用的信息,因此我不想在我的文档中包含它。我希望看到的输出如下所示:
类 package.Class
有没有一种方法可以将
object
从基类列表中排除?我有这个类:
class Class:
pass
生成的文档(如果有必要,我使用了autodoc
扩展程序)如下:
从类 package.Class
基类: object
object
继承并不是对读者有用的信息,因此我不想在我的文档中包含它。我希望看到的输出如下所示:
类 package.Class
object
从基类列表中排除?实际上,这深深地嵌入在自动文档autodoc
源代码中,并且没有关闭它的方法:
bases = [b.__module__ in ('__builtin__', 'builtins') and
u':class:`%s`' % b.__name__ or
u':class:`%s.%s`' % (b.__module__, b.__name__)
for b in self.object.__bases__]
self.add_line(u' ' + _(u'Bases: %s') % ', '.join(bases), sourcename)
object
没有被特殊处理,没有内置的方法可以将其从列表中排除。
我找到的最好(自动化)解决方案是在autodoc
上进行猴子补丁。
将以下内容添加到conf.py
可以实现所需的行为:
# ClassDocumenter.add_directive_header uses ClassDocumenter.add_line to
# write the class documentation.
# We'll monkeypatch the add_line method and intercept lines that begin
# with "Bases:".
# In order to minimize the risk of accidentally intercepting a wrong line,
# we'll apply this patch inside of the add_directive_header method.
from sphinx.ext.autodoc import ClassDocumenter, _
add_line = ClassDocumenter.add_line
line_to_delete = _(u'Bases: %s') % u':class:`object`'
def add_line_no_object_base(self, text, *args, **kwargs):
if text.strip() == line_to_delete:
return
add_line(self, text, *args, **kwargs)
add_directive_header = ClassDocumenter.add_directive_header
def add_directive_header_no_object_base(self, *args, **kwargs):
self.add_line = add_line_no_object_base.__get__(self)
result = add_directive_header(self, *args, **kwargs)
del self.add_line
return result
ClassDocumenter.add_directive_header = add_directive_header_no_object_base
\n
。 - Andrei Korshikov关于2022年6月和Sphinx v5.0.1,Aran-Fey的回答有点过时;在我的情况下有效的解决方案是替换这行代码:
line_to_delete = _(u'Bases: %s') % u':class:`object`'
使用这个:
line_to_delete = _(u'Bases: %s') % u':py:class:`object`'
add_directive_header_no_object_base
从未被调用过(我在那里添加了一个打印语句,但输出中没有任何内容)。 - AlwaysLearningu
了。我的意思是,现在字符串默认是Unicode的。顺便说一下,我更喜欢将sphinx.ext.autodoc
中的_
改为localize
,因为我觉得我不会记得_
是本地化函数。 - Andrei Korshikov_
的主要目的是使具有大量本地化字符串的代码紧凑且易读,而实现这一目标的一种方式是使用别名,越短越好。我不会说 localize()
很短。 - undefinedobject
),你将不得不手动预处理每个类。
autoclass
指令来记录类,则不要使用:show-inheritance:
选项。如果您使用automodule
生成所有模块成员的文档,关闭:show-inheritance:
将无济于事,因为每个类的基类都不会被记录在文档中。因此,我建议按照以下步骤进行:
步骤1:像这样在模块外部记录类而不使用:show-inheritance:
:my\.mod module
--------------
.. automodule:: my.mod
:members:
:undoc-members:
:show-inheritance:
.. autoclass:: Class
:members:
:undoc-members:
步骤2: 在你的conf.py
中通过autodoc-skip-member
钩子过滤模块的automodule
文档中的Class
类:
def skip_some_classes(app, what, name, obj, skip, options):
return skip or name in ('Class',) # define some better condition here
def setup(app):
app.connect('autodoc-skip-member', skip_some_classes)
Class
之外的所有模块成员都将使用:show-inheritance:
选项进行处理,而Class
则会被单独处理。skip_some_classes
定义为return skip or (isinstance(obj, type) and obj.__base__ is object)
。 - Aran-Feysphinx.apidoc
模块并覆盖例如create_module_file
函数,对纯类进行分离以使其不被自动模块化,但这可能会更麻烦,而且可能不值得。 - hoefling对我来说,这是一个非常简单的解决方案。
from sphinx.ext import autodoc
class MockedClassDocumenter(autodoc.ClassDocumenter):
def add_line(self, line: str, source: str, *lineno: int) -> None:
if line == " Bases: :py:class:`object`":
return
super().add_line(line, source, *lineno)
autodoc.ClassDocumenter = MockedClassDocumenter
conf.py
文件中。
automodule
指令来记录每个模块成员的文档? - hoeflingmodule.rst
包含了通常由sphinx-apidoc
生成的.. automodule:: module :members: :undoc-members: :show-inheritance:
。 - Aran-Fey