Mam moduł, który powinien mieć @property
, rozwiązałem go, ustawiając klasę jako moduł. Pomyślałem o tej odpowiedzi: Lazy module variables--can it be done?Właściwości modułu dokumentu Sphinx
Chciałem, aby to było powtarzalne i łatwe w użyciu, więc zrobiłem dla niego metaclass. Działa to jak urok.
Problem polega na tym, że podczas używania sfinksa do generowania właściwości dokumentacji nie są dokumentowane. Wszystko inne jest udokumentowane zgodnie z oczekiwaniami. Nie mam pojęcia, jak to naprawić, może to jest problem ze Sphinx?
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 copy-paste do generowania/zobaczyć dokumentację Sphinx:
sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html
Najbardziej istotne jest to, aby udokumentować właściwości klasy. Punkty premiowe za dokumentowanie oryginalnych członków modułu.
Edycja: Klasa powinny udokumentować, jak to jest w module Klasa jest używany w ten sposób, a tym samym sposób ten powinien pojawić się w Sfinksa..
Przykład pożądaną wydajność:
Module Foo
TestClass docstring.
some_property
Property docstring.
meth()
meth doc
EDIT 2: I stwierdzono, że co może pomóc w znalezieniu rozwiązania. Kiedy o normalnej moduł foo
o następującej treści:
#: Property of foo
prop = 'test'
Sphinx to dokumenty takie jak:
foo.prop = 'test'
Property of foo
Te same prace, jeżeli prop
jest atrybutem klasy. Nie domyśliłem się, dlaczego to nie działa w moim szczególnym przypadku.
Twój kod nie działa. 'ModMeta' nie jest zdefiniowany. Czy mógłbyś opublikować działający kod? – jterrace
@jterrace Copy-paste fail. Naprawiono teraz ;-) – siebz0r
Usunięto moją odpowiedź, ponieważ oryginalny kod miał '__metaclass_' zamiast' __metaclass__', co powodowało, że nie działał. – jterrace