Entwicklung von Autodoc-Erweiterungen

Ziel dieses Tutorials ist es, eine Erweiterung zu erstellen, die Unterstützung für einen neuen Typ für Autodoc hinzufügt. Diese Autodoc-Erweiterung formatiert die IntEnum-Klasse aus der Python-Standardbibliothek. (Modul enum)

Übersicht

Wir möchten eine Erweiterung, die eine automatische Dokumentation für IntEnum erstellt. IntEnum ist die Integer-Enum-Klasse aus dem Standardmodul enum.

Derzeit hat diese Klasse kein spezielles Autodoc-Verhalten.

Wir möchten Autodoc Folgendes hinzufügen:

  • Eine neue autointenum-Direktive, die die IntEnum-Klasse dokumentiert.

  • Die generierte Dokumentation enthält alle möglichen Enum-Werte mit Namen.

  • Die autointenum-Direktive hat eine Option :hex:, die dazu führt, dass die ganzen Zahlen in hexadezimaler Form ausgegeben werden.

Voraussetzungen

Wir benötigen die gleiche Einrichtung wie in den vorherigen Erweiterungen. Diesmal legen wir unsere Erweiterung in eine Datei namens autodoc_intenum.py. Die Datei my_enums.py enthält die Beispiel-Enums, die wir dokumentieren werden.

Hier ist ein Beispiel für die Ordnerstruktur, die Sie erhalten könnten

└── source
    ├── _ext
    │   └── autodoc_intenum.py
    ├── conf.py
    ├── index.rst
    └── my_enums.py

Schreiben der Erweiterung

Beginnen Sie mit der setup-Funktion für die Erweiterung.

1def setup(app: Sphinx) -> ExtensionMetadata:
2    app.setup_extension('sphinx.ext.autodoc')  # Require autodoc extension
3    app.add_autodocumenter(IntEnumDocumenter)
4    return {
5        'version': '1',
6        'parallel_read_safe': True,
7    }

Die Methode setup_extension() ruft die Autodoc-Erweiterung auf, da unsere neue Erweiterung von Autodoc abhängt. add_autodocumenter() ist die Methode, die unsere neue Autodokumentationsklasse registriert.

Wir möchten bestimmte Objekte aus der Autodoc-Erweiterung importieren

1from __future__ import annotations
2
3from enum import IntEnum
4from typing import TYPE_CHECKING
5
6from sphinx.ext.autodoc import ClassDocumenter, Documenter, bool_option
7

Es gibt verschiedene Dokumentationsklassen wie MethodDocumenter oder AttributeDocumenter in der Autodoc-Erweiterung, aber unsere neue Klasse ist eine Unterklasse von ClassDocumenter, einer Dokumentationsklasse, die von Autodoc zum Dokumentieren von Klassen verwendet wird.

Dies ist die Definition unserer neuen Autodokumentationsklasse

 1class IntEnumDocumenter(ClassDocumenter):
 2    objtype = 'intenum'
 3    directivetype = ClassDocumenter.objtype
 4    priority = 10 + ClassDocumenter.priority
 5    option_spec = dict(ClassDocumenter.option_spec)
 6    option_spec['hex'] = bool_option
 7
 8    @classmethod
 9    def can_document_member(
10        cls, member: Any, membername: str, isattr: bool, parent: Documenter
11    ) -> bool:
12        try:
13            return issubclass(member, IntEnum)
14        except TypeError:
15            return False
16
17    def add_directive_header(self, sig: str) -> None:
18        super().add_directive_header(sig)
19        self.add_line('   :final:', self.get_sourcename())
20
21    def add_content(
22        self,
23        more_content: StringList | None,
24    ) -> None:
25        super().add_content(more_content)
26
27        source_name = self.get_sourcename()
28        enum_object: IntEnum = self.object
29        use_hex = self.options.hex
30        self.add_line('', source_name)
31
32        for the_member_name, enum_member in enum_object.__members__.items():  # type: ignore[attr-defined]
33            the_member_value = enum_member.value
34            if use_hex:
35                the_member_value = hex(the_member_value)
36
37            self.add_line(f'**{the_member_name}**: {the_member_value}', source_name)
38            self.add_line('', source_name)

Wichtige Attribute der neuen Klasse

objtype

Dieses Attribut bestimmt den Namen der auto-Direktive. In diesem Fall ist die Auto-Direktive autointenum.

directivetype

Dieses Attribut legt den Namen der generierten Direktive fest. In diesem Beispiel ist die generierte Direktive .. :py:class::.

priority

Je größer die Zahl, desto höher die Priorität. Wir möchten, dass unser Dokumentator eine höhere Priorität hat als die Elternklasse.

option_spec

Optionen-Spezifikationen. Wir kopieren die Optionen der Elternklasse und fügen eine neue Option hex hinzu.

Überschriebene Member

can_document_member

Dieser Member ist wichtig zu überschreiben. Er sollte True zurückgeben, wenn das übergebene Objekt von dieser Klasse dokumentiert werden kann.

add_directive_header

Diese Methode generiert den Direktiven-Header. Wir fügen die Direktiven-Option :final: hinzu. Denken Sie daran, super aufzurufen, sonst wird keine Direktive generiert.

add_content

Diese Methode generiert den Body der Klassendokumentation. Nach dem Aufruf der Super-Methode generieren wir Zeilen für die Enum-Beschreibung.

Verwenden der Erweiterung

Sie können nun die neue Autodoc-Direktive verwenden, um jede IntEnum zu dokumentieren.

Zum Beispiel haben Sie die folgende IntEnum

my_enums.py
class Colors(IntEnum):
    """Colors enumerator"""
    NONE = 0
    RED = 1
    GREEN = 2
    BLUE = 3

Dies ist die Dokumentationsdatei mit der Autodoc-Direktive

index.rst
.. autointenum:: my_enums.Colors

Weitere Lektüre

Wenn Sie Ihre Erweiterung über mehrere Projekte oder mit anderen teilen möchten, lesen Sie den Abschnitt Drittanbieter-Erweiterungen.