Wie dokumentiere ich mit Sphinxs Autodoc die __init __ (self) -Methode einer Klasse?

105

Sphinx generiert standardmäßig keine Dokumente für __init __ (self). Ich habe folgendes versucht:

.. automodule:: mymodule
    :members:

und

..autoclass:: MyClass
    :members:

Wenn Sie in conf.py Folgendes festlegen, wird nur die __init __ (selbst) docstring an die Klasse docstring angehängt ( die Sphinx-Autodoc-Dokumentation scheint zuzustimmen, dass dies das erwartete Verhalten ist, erwähnt jedoch nichts in Bezug auf das Problem, das ich zu lösen versuche):

autoclass_content = 'both'
Jacob Marmor
quelle
Nein, das ist zumindest nicht das, was die Dokumentation heute schreibt: "both" Both the class’ and the __init__ method’s docstring are concatenated and inserted.-> Daher sollte es nicht nur die __init__(self), sondern auch die Klassendokumentation sein, wenn Sie diese haben. Können Sie einen Testfall bereitstellen, denn wenn dies der Fall ist, fühlt es sich wie ein Fehler an, oder?
lpapp

Antworten:

115

Hier sind drei Alternativen:

  1. Um sicherzustellen, dass dies __init__()immer dokumentiert ist, können Sie es autodoc-skip-memberin conf.py verwenden. So was:

    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)
    

    Dies definiert ausdrücklich, dass __init__nicht übersprungen werden soll (was standardmäßig der Fall ist). Diese Konfiguration wird einmal angegeben und erfordert kein zusätzliches Markup für jede Klasse in der ersten Quelle.

  2. Die special-membersOption wurde in Sphinx 1.1 hinzugefügt . __special__Dadurch werden "spezielle" Mitglieder (solche mit Namen wie ) von autodoc dokumentiert.

    Seit Sphinx 1.2 verwendet diese Option Argumente, wodurch sie nützlicher ist als zuvor.

  3. Verwendung automethod:

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

    Dies muss für jede Klasse hinzugefügt werden (kann nicht verwendet werden automodule, wie in einem Kommentar zur ersten Überarbeitung dieser Antwort ausgeführt).

mzjn
quelle
7
Das hilft beim Automodul nicht, da es jeder Klasse hinzugefügt werden muss.
Roger Binns
3
Die erste Alternative hat funktioniert. In meinem Fall war es besser als die zweite und dritte Alternative, da keine ersten Dateien bearbeitet werden müssen.
Jcarballo
9
Funktioniert in Sphinx 1.2.1 einwandfrei special-membersmit automodule. Verwendung :special-members: __init__zu dokumentieren nur __init__.
Florian Brucker
66

Du warst nah. Sie können die autoclass_contentOption in Ihrer conf.pyDatei verwenden:

autoclass_content = 'both'
gotgenes
quelle
1
@ MichaelMrozek: Ich wundere mich auch darüber ... Hast du die hohe Upvote-Rate dieser Antwort verstanden? Auf den ersten Blick sieht es nach einer Antwort aus, die gelöscht werden sollte.
lpapp
1
Ich habe versucht, die autoclass_content = 'both'Option festzulegen , mit der die Init- Methode dokumentiert wurde , aber die automatische Zusammenfassung wurde zweimal angezeigt.
Stretch
Dies sollte die akzeptierte Antwort sein. Es ist einfacher und bezieht sich auf die offizielle Sphinx-Dokumentation.
BerriJ
6

In den letzten Jahren habe ich mehrere Varianten geschrieben autodoc-skip-memberRückrufe für verschiedene unabhängige Python - Projekte , weil ich Methoden wollte wie __init__(), __enter__()und __exit__()in meiner API - Dokumentation zu zeigen (immerhin diese „spezielle Methoden“ sind Teil der API und was einen besseren Ort zu dokumentieren Sie sie als in der Dokumentzeichenfolge der speziellen Methode).

Kürzlich habe ich die beste Implementierung genommen und sie zu einem meiner Python-Projekte gemacht ( hier ist die Dokumentation ). Die Implementierung läuft im Wesentlichen auf Folgendes hinaus:

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

Ja, es gibt mehr Dokumentation als Logik :-). Der Vorteil der Definition eines autodoc-skip-membersolchen Rückrufs gegenüber der Verwendung der special-membersOption (für mich) besteht darin, dass die special-membersOption auch die Dokumentation von Eigenschaften wie __weakref__(verfügbar für alle Klassen neuen Stils, AFAIK) ermöglicht, die ich als Rauschen betrachte und die überhaupt nicht nützlich sind. Der Callback-Ansatz vermeidet dies (da er nur für Funktionen / Methoden funktioniert und andere Attribute ignoriert).

xolox
quelle
Wie benutze ich das? Es scheint, dass die Methode benannt werden setup(app)muss, um von Sphinx ausgeführt zu werden.
Oarfish
Ich verstehe nicht alles, aber sehen Sie sich die Implementierung von xolox an , wenn Sie sich selbst sezieren möchten. Ich glaube, er hat eine Sphinx-Erweiterung erstellt, die einen Rückruf mit dem Autodoc-Skip-Member-Ereignis verbindet. Wenn die Sphinx versucht herauszufinden, ob etwas enthalten / übersprungen werden soll, wird dieses Ereignis ausgelöst und sein Code wird ausgeführt. Wenn sein Code ein spezielles Mitglied erkennt , das vom Benutzer explizit definiert wurde (geerbt, wie es häufig vorkommt), weist er Sphinx an, es einzuschließen. Auf diese Weise können Sie spezielle Mitglieder dokumentieren, die Sie selbst schreiben
Andrew
Vielen Dank für die Klarstellungen Andrew und ja, Sie sind richtig oarfish, eine Setup-Funktion wird benötigt. Ich habe es dem Beispiel hinzugefügt, um weitere Verwirrung zu vermeiden.
Xolox
@JoelB: Der Beispielcode in meinem Beitrag geht davon aus, dass Ihre __init__Methode eine nicht leere Dokumentzeichenfolge hat. Macht es?
Xolox
2

Obwohl dies ein älterer Beitrag ist, gibt es für diejenigen, die ihn ab sofort nachschlagen, auch eine andere Lösung, die in Version 1.8 eingeführt wurde. Gemäß der Dokumentation können Sie den special-memberSchlüssel in den autodoc_default_options zu Ihrem hinzufügen conf.py.

Beispiel:

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

Dies ist eine Variante, die nur enthält, __init__wenn sie Argumente enthält:

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)
letmaik
quelle