tutorial example automodule python python-sphinx autodoc

example - sphinx python



¿Cómo usar el autodoc de Sphinx para documentar el método__init__(self) de una clase? (3)

Aquí hay tres alternativas:

  1. Para asegurarse de que __init__() siempre esté documentado, puede usar autodoc-skip-member en conf.py. Me gusta esto:

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

    Esto define explícitamente que __init__ no debe __init__ (que es por defecto). Esta configuración se especifica una vez y no requiere ningún marcado adicional para cada clase en la primera fuente.

  2. La opción de special-members se agregó en Sphinx 1.1 . Hace que los miembros "especiales" (aquellos con nombres como __special__ ) sean documentados por autodoc.

    Desde Sphinx 1.2, esta opción toma argumentos que la hacen más útil de lo que era anteriormente.

  3. Use automethod :

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

    Esto debe agregarse para cada clase (no se puede usar con automodule , como se señala en un comentario de la primera revisión de esta respuesta).

Sphinx no genera documentos para __init __ (self) de forma predeterminada. He probado lo siguiente:

.. automodule:: mymodule :members:

y

..autoclass:: MyClass :members:

En conf.py, establecer lo siguiente solo agrega la __init __ (self) docstring a la clase docstring ( la documentación de autodoc de Sphinx parece estar de acuerdo en que este es el comportamiento esperado, pero no menciona nada con respecto al problema que intento resolver):

autoclass_content = ''both''


En los últimos años, he escrito varias variantes de autodoc-skip-member de autodoc-skip-member de autodoc-skip-member para varios proyectos Python no relacionados porque quería que los métodos como __init__() , __enter__() y __exit__() aparezcan en mi documentación API (después de todo, estos "métodos especiales" son parte de la API y qué mejor lugar para documentarlos que dentro de la carpeta de documentos del método especial).

Recientemente tomé la mejor implementación y la hice parte de uno de mis proyectos de Python ( aquí está la documentación ). La implementación básicamente se reduce a esto:

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

Sí, hay más documentación que lógica :-). La ventaja de definir una autodoc-skip-member como esta sobre el uso de la opción de special-members (para mí) es que la opción de special-members también habilita la documentación de propiedades como __weakref__ (disponible en todas las clases de estilo nuevo, AFAIK ) que considero ruido y nada útil. El enfoque de devolución de llamada lo evita (porque solo funciona en funciones / métodos e ignora otros atributos).


Estabas cerca. Puede usar la opción autoclass_content en su archivo conf.py :

autoclass_content = ''both''