关于python:如何使用Sphinx的autodoc来记录类的__init __(自我)方法?

How to use Sphinx's autodoc to document a class's __init__(self) method?

默认情况下,sphinx不会为uuu init_uuuuu(self)生成文档。我尝试了以下方法:

1
2
.. automodule:: mymodule
    :members:

1
2
..autoclass:: MyClass
    :members:

在conf.py中,设置以下内容只会将uuu init_uuuu(self)docstring附加到类docstring(sphinx autodoc文档似乎同意这是预期的行为,但没有提到我要解决的问题):

1
autoclass_content = 'both'


以下是三个备选方案:

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

    1
    2
    3
    4
    5
    6
    7
    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源中的每个类添加任何其他标记。

  • 在斯芬克斯1.1中增加了special-members选项。它使"特殊"成员(名称如__special__的成员)由autodoc记录。

    因为sphinx 1.2,这个选项采用的参数比以前更有用。

  • 使用automethod

    1
    2
    3
    4
    .. autoclass:: MyClass    
       :members:

       .. automethod:: __init__

    必须为每个类添加此项(不能与automodule一起使用,如对该答案第一次修订的注释所指出的)。


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

    1
    autoclass_content = 'both'


    在过去的几年里,我为各种无关的python项目编写了几种不同的autodoc-skip-member回调,因为我希望像__init__()__enter__()__exit__()这样的方法出现在我的api文档中(毕竟,这些"特殊方法"是api的一部分,还有什么比在特殊的Ethod的docstring)。

    最近,我采用了最好的实现,并将其作为我的一个Python项目的一部分(以下是文档)。实现主要归结为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    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

    是的,有比逻辑更多的文档:—)。与使用special-members选项相比,定义这样的autodoc-skip-member回调的好处在于,special-members选项还支持记录我认为噪声和根本没有用处的属性,如__weakref__(可用于所有新样式类,afaik)。回调方法避免了这种情况(因为它只在函数/方法上工作,并且忽略其他属性)。