如何使用Sphinx的autodoc来记录类的__init __(self)方法?

时间:2011-04-08 18:23:39

标签: python python-sphinx autodoc

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

.. automodule:: mymodule
    :members:

..autoclass:: MyClass
    :members:

在conf.py中,设置以下内容只会将__init __(self)文档字符串附加到类docstring(the Sphinx autodoc documentation似乎同意这是预期的行为,但对于我正在尝试的问题没有提到任何内容解决):

autoclass_content = 'both'

5 个答案:

答案 0 :(得分:92)

以下是三种选择:

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

    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选项为added in Sphinx 1.1。它使“特殊”成员(名称为__special__的成员)由autodoc记录。

    从Sphinx 1.2开始,这个选项采用的参数使它比以前更有用。

  3. 使用automethod

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

    必须为每个班级添加(不能与automodule一起使用,正如对此答案第一版的评论中所指出的那样)。

答案 1 :(得分:55)

你很亲密。您可以使用conf.py文件中的autoclass_content选项:

autoclass_content = 'both'

答案 2 :(得分:2)

在过去的几年里,我为各种不相关的Python项目编写了几个autodoc-skip-member回调变体,因为我想要__init__()__enter__()__exit__()等方法显示在我的API文档中(毕竟,这些"特殊方法"是API的一部分,并且比特殊方法的文档字符串更适合记录它们。)

最近我采用了最好的实现,并将其作为我的一个Python项目(here's the documentation)的一部分。实施基本上归结为:

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),我认为噪音,根本没用。回调方法避免了这种情况(因为它只适用于函数/方法并忽略其他属性)。

答案 3 :(得分:2)

即使这是一篇较旧的文章,对于那些至今为止正在寻找它的人,在版本1.8中还引入了另一种解决方案。根据{{​​3}},您可以将autodoc_default_options中的special-member键添加到conf.py中。

示例:

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

答案 4 :(得分: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)