Eigenschaften des Sphinx-Dokumentenmoduls
Ich habe ein Modul, das eine haben sollte@property
Ich 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.