【问题标题】:Python-Sphinx: "inherit" method documentation from superclassPython-Sphinx:从超类“继承”方法文档
【发布时间】:2016-11-09 13:44:30
【问题描述】:

编辑: 截至目前(Sphinx 1.4.9)似乎没有办法告诉 Sphinx 做我想做的事(参见 GitHub 上的issue)。来自 Brecht Machiels 的 accepted answer 以另一种方式解决了这个问题,直到 Sphinx 有一天能够这样做。

说明: 我正在尝试用 sphinx-apidoc 记录一个 Python 项目。 Sphinx 配置几乎是默认配置,我只包含了'sphinx.ext.autodoc'

它通常可以工作,但派生类不会像我期望的那样继承其超类的方法文档。

示例: 考虑一个名为project 的非常简约的Python 包。除了一个空的__init__.py,它只包含一个文件(base.py,见下文)

# -*- coding: utf-8 -*
import abc


class Superclass(object):
    """The one to rule them all"""

    @abc.abstractmethod
    def give(self, ring):
        """Give out a ring"""
        pass


class Derived(Superclass):
    """Somebody has to do the work"""

    def give(self, ring):
        print("I pass the ring {} to you".format(ring))

运行 sphinx-apidoc (sphinx-apidoc -o apidoc project -f) 会生成以下文件:

  • apidoc/modules.rst

    project
    =======
    
    .. toctree::
       :maxdepth: 4
    
       project
    
  • apidoc/project.rst

    project package
    ===============
    
    Submodules
    ----------
    
    project.base module
    -------------------
    
    .. automodule:: project.base
        :members:
        :undoc-members:
        :show-inheritance:
    
    
    Module contents
    ---------------
    
    .. automodule:: project
        :members:
        :undoc-members:
        :show-inheritance:
    

在默认的index.rst 中包含apidoc/modules.rst,后跟make html 会为这两个类及其方法生成一个基本的html 文档。不幸的是,Derived.give 的文档字符串是空的。

问题: 有没有办法告诉 Sphinx 在没有装饰器魔法的情况下采用父方法文档,如this SO 帖子中所述,每个方法都有?

【问题讨论】:

    标签: python inheritance python-sphinx docstring


    【解决方案1】:

    您可以通过为抽象基类使用元类来自动管理文档字符串。以下是此类元类的一个非常基本的实现。它需要扩展以正确处理多个基类和极端情况。

    # -*- coding: utf-8 -*
    import abc
    
    
    class SuperclassMeta(type):
        def __new__(mcls, classname, bases, cls_dict):
            cls = super().__new__(mcls, classname, bases, cls_dict)
            for name, member in cls_dict.items():
                if not getattr(member, '__doc__'):
                    member.__doc__ = getattr(bases[-1], name).__doc__
            return cls
    
    
    class Superclass(object, metaclass=SuperclassMeta):
        """The one to rule them all"""
    
        @abc.abstractmethod
        def give(self, ring):
            """Give out a ring"""
            pass
    
    
    class Derived(Superclass):
        """Somebody has to do the work"""
    
        def give(self, ring):
            print("I pass the ring {} to you".format(ring))
    

    这甚至比让 Sphinx 这样做更好的解决方案,因为这在派生类上调用 help() 时也可以工作。

    【讨论】:

    猜你喜欢
    • 2012-11-24
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2023-03-23
    • 2013-05-01
    • 1970-01-01
    • 2011-09-26
    • 2018-02-04
    相关资源
    最近更新 更多