如何使用Sphinx的自动文档来记录类的__init __(self)方法?


107

Sphinx默认情况下不会为__init __(self)生成文档。我尝试了以下方法:

.. automodule:: mymodule
    :members:

..autoclass:: MyClass
    :members:

在conf.py中,设置以下内容只会将__init __(self)文档字符串附加到类文档字符串(Sphinx autodoc文档似乎同意这是预期的行为,但未提及我要解决的问题):

autoclass_content = 'both'

不,至少到今天"both" Both the class’ and the __init__ method’s docstring are concatenated and inserted.为止,这还不是文档编写的内容:->因此,__init__(self)如果有的话,它不仅应该是,还应该是文档字符串类。您能提供一个测试用例,因为如果是这样,感觉就像是个错误,对吗?
lpapp

Answers:


116

这是三种选择:

  1. 为了确保__init__()始终记录autodoc-skip-member在文档中,可以在conf.py中使用。像这样:

    def skip(app, what, name, obj, would_skip, options):
        if name == "__init__":
            return False
        return would_skip
    
    def setup(app):
        app.connect("autodoc-skip-member", skip)

    这明确定义了__init__不被跳过(默认情况下为跳过)。仅一次指定此配置,并且.rst源中的每个类都不需要任何其他标记。

  2. special-members选项已在Sphinx 1.1添加。它使“特殊”成员(名称如的成员__special__)由autodoc记录。

    从Sphinx 1.2开始,此选项接受参数,这使其比以前更有用。

  3. 用途automethod

    .. autoclass:: MyClass     
       :members: 
    
       .. automethod:: __init__

    这必须为每个类添加(不能与一起使用automodule,如对此答案的第一个修订版的注释中指出的那样)。


7
这对自动模块没有帮助,因为必须将其添加到每个类中。
罗杰·宾恩斯

3
第一个选择起作用了。就我而言,它比第二和第三种方法要好,因为它不需要编辑.rst文件。
jcarballo

9
在Sphinx 1.2.1中,special-members使用可以正常工作automodule。使用:special-members: __init__只记录__init__
Florian Brucker 2014年

67

你近了 您可以autoclass_contentconf.py文件中使用该选项:

autoclass_content = 'both'

1
@MichaelMrozek:我也想知道...您知道这个答案的高投票率吗?首先,它看起来像一个应该清除的答案。
lpapp 2014年

1
我尝试设置该autoclass_content = 'both'选项,该选项的确记录了init方法,但它使自动摘要出现了两次。
伸展

这应该是公认的答案。它更简单,它引用了官方的狮身人面像文档。
BerriJ

6

在过去的几年中,我autodoc-skip-member为各种不相关的Python项目编写了多种回调类型,因为我希望使用诸如之类的方法__init__()__enter__()并将__exit__()其显示在我的API文档中(毕竟,这些“特殊方法”是API的一部分,还有什么更好的地方记录它们,而不是在特殊方法的文档字符串中记录它们。

最近,我采用了最佳的实现,并将其纳入了我的Python项目之一(这是文档)。实现基本上可以归结为:

import types

def setup(app):
    """Enable Sphinx customizations."""
    enable_special_methods(app)


def enable_special_methods(app):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    :param app: The Sphinx application object.

    This function connects the :func:`special_methods_callback()` function to
    ``autodoc-skip-member`` events.

    .. _autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
    """
    app.connect('autodoc-skip-member', special_methods_callback)


def special_methods_callback(app, what, name, obj, skip, options):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    Refer to :func:`enable_special_methods()` to enable the use of this
    function (you probably don't want to call
    :func:`special_methods_callback()` directly).

    This function implements a callback for ``autodoc-skip-member`` events to
    include documented "special methods" (method names with two leading and two
    trailing underscores) in your documentation. The result is similar to the
    use of the ``special-members`` flag with one big difference: Special
    methods are included but other types of members are ignored. This means
    that attributes like ``__weakref__`` will always be ignored (this was my
    main annoyance with the ``special-members`` flag).

    The parameters expected by this function are those defined for Sphinx event
    callback functions (i.e. I'm not going to document them here :-).
    """
    if getattr(obj, '__doc__', None) and isinstance(obj, (types.FunctionType, types.MethodType)):
        return False
    else:
        return skip

是的,文档比逻辑更多:-)。autodoc-skip-member相对于使用special-members选项(对我而言)定义这样的回调的好处是,该special-members选项还可以记录属性__weakref__(例如,在所有新样式类AFAIK上可用)的文档,而我认为这些属性根本没有用。回调方法避免了这种情况(因为它仅适用于函数/方法,而忽略其他属性)。


我该如何使用呢?看来必须命名该方法才能setup(app)由Sphinx执行。
oarfish

我不是全部理解,但是如果您想剖析自己,请参阅xolox的实现。我相信他构建了一个狮身人面像扩展程序,该扩展程序将回调连接到autodoc-skip-member事件。当狮身人面像试图找出是否应该包含/跳过某些东西时,该事件将触发,并且他的代码运行。如果他的代码检测到由用户显式定义的特殊成员(如通常那样进行继承),则它将告诉Sphinx包括它。这样,你可以DOC特别会员,你自己写的
安德鲁·

感谢您所做的澄清,Andrew,是的,您是正确的浆鱼,需要设置功能。我将其添加到示例中以避免进一步的混乱。
xolox

@JoelB:我的帖子中的示例代码是假设您的__init__方法具有非空文档字符串。可以?
xolox

2

尽管这是一个较旧的文章,但对于那些现在为止正在查找它的人,版本1.8中还引入了另一个解决方案。根据文档,您可以将special-member密钥添加 到autodoc_default_options中conf.py

例:

autodoc_default_options = {
    'members': True,
    'member-order': 'bysource',
    'special-members': '__init__',
    'undoc-members': True,
    'exclude-members': '__weakref__'
}

0

这是一个变体,仅__init__当具有参数时才包括:

import inspect

def skip_init_without_args(app, what, name, obj, would_skip, options):
    if name == '__init__':
        func = getattr(obj, '__init__')
        spec = inspect.getfullargspec(func)
        return not spec.args and not spec.varargs and not spec.varkw and not spec.kwonlyargs
    return would_skip

def setup(app):
    app.connect("autodoc-skip-member", skip_init_without_args)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.