Właściwości modułu dokumentu Sphinx
Mam moduł, który powinien mieć@property
, Rozwiązałem to, ustawiając klasę jako moduł. Mam pomysł z tej odpowiedzi:Leniwe zmienne modułowe - czy można to zrobić?
Chciałem, aby było to powtarzalne i łatwe w użyciu, więc stworzyłem dla niego metaklasę. To działa jak urok.
Problem polega na tym, że podczas używania Sphinx do generowania dokumentacji, dokumentacja nie jest dokumentowana. Wszystko inne jest udokumentowane zgodnie z oczekiwaniami. Nie mam pojęcia, jak to naprawić, może to problem z Sfinksem?
Moduł:
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
I wklej kopię, aby wygenerować / wyświetlić dokumentację Sphinx:
sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html
Najważniejszą częścią jest udokumentowanie właściwości klasy. Dodatkowe punkty do dokumentowania oryginalnych członków modułu.
EDYTOWAĆ: Klasa powinna być udokumentowana jako moduł, w którym się znajduje. Klasa jest używana w ten sposób i dlatego powinna pojawić się w ten sposób w Sphinx.
Przykład pożądanego wyjścia:
Module Foo
TestClass docstring.
some_property
Property docstring.
meth()
meth doc
EDYCJA 2: Znalazłem coś, co może pomóc w znalezieniu rozwiązania. Kiedy masz regularny modułfoo
o następującej treści:
#: Property of foo
prop = 'test'
Dokumenty Sfinksa to jak:
foo.prop = 'test'
Property of foo
To samo działa, jeśliprop
jest atrybutem klasy. Nie wiem, dlaczego nie działa w moim specjalnym przypadku.