如何防止Sphinx将“object”列为基类?

时间:2017-09-18 12:14:15

标签: python inheritance python-sphinx

我有这堂课:

class Class:
    pass

sphinx生成的文档(如果重要,我使用autodoc扩展名)看起来像这样:

  

class package。 Class

     

基地:对象

object的继承对读者来说并不是有用的信息,因此我不希望它出现在我的文档中。我想看到的输出是:

  

class package。 Class

有没有办法从基类列表中排除object

2 个答案:

答案 0 :(得分:4)

这实际上深深嵌入the autodoc source code,无法将其关闭:

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未获得任何特殊待遇;没有内置的方法将其从列表中排除。

我能找到的最佳(自动)解决方案是monkeypatch 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

答案 1 :(得分:1)

免责声明:这可能不是最好或最优雅的解决方案,因为您拥有的更简单的类(仅限子类object),您将需要做的工作越多你必须手动预处理每个类。

如果您使用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步:通过autodoc-skip-member hookClass中的模块automodule文档中过滤类conf.py

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则会被单独处理。