Eigenschaften des Sphinx-Dokumentenmoduls

Ich habe ein Modul, das eine haben sollte@propertyIch löste dieses Problem, indem ich eine Klasse als Modul festlegte. Ich habe die Idee aus dieser Antwort:Lazy Modulvariablen - geht das?

Ich wollte, dass dies wiederholbar und einfach zu handhaben ist, also habe ich eine Metaklasse dafür erstellt. Das wirkt wie ein Zauber.

Das Problem ist, dass beim Generieren von Dokumentationseigenschaften mit Sphinx keine Dokumentation erstellt wird. Alles andere ist wie erwartet dokumentiert. Ich habe keine Ahnung, wie ich das beheben kann. Vielleicht liegt ein Problem mit Sphinx vor?

Das Modul:

import sys
import types

class ClassAsModule(type):
    def __new__(cls, name, bases, attrs):
        # Make sure the name of the class is the module name.
        name = attrs.pop('__module__')
        # Create a class.
        cls = type.__new__(cls, name, bases, attrs)
        # Instantiate the class and register it.
        sys.modules[name] = cls = cls(name)
        # Update the dict so dir works properly
        cls.__dict__.update(attrs)

class TestClass(types.ModuleType):
    """TestClass docstring."""
    __metaclass__ = ClassAsModule
    @property
    def some_property(self):
        """Property docstring."""
        pass
    def meth():
        """meth doc"""
        pass

Und ein Kopieren-Einfügen, um die Sphinx-Dokumentation zu generieren / anzuzeigen:

sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html

Der wichtigste Teil besteht darin, die Eigenschaften der Klasse zu dokumentieren. Bonuspunkte, um auch originale Modulmitglieder zu dokumentieren.

BEARBEITEN: Die Klasse sollte als das Modul dokumentiert sein, in dem sie sich befindet. Die Klasse wird auf diese Weise verwendet und sollte daher in Sphinx auf diese Weise angezeigt werden.

Beispiel für die gewünschte Ausgabe:

Module Foo
    TestClass docstring.

    some_property
        Property docstring.

    meth()
        meth doc

EDIT 2: Ich habe etwas gefunden, das bei der Suche nach einer Lösung hilfreich sein kann. Wenn Sie ein reguläres Modul habenfoo mit folgendem Inhalt:

#: Property of foo
prop = 'test'

Sphinx dokumentiert dies wie folgt:

foo.prop = 'test'
    Property of foo

Das gleiche funktioniert wennprop ist ein Attribut einer Klasse. Ich habe nicht herausgefunden, warum es in meinem speziellen Fall nicht funktioniert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage