Ho un modulo che dovrebbe avere un @property
, ho risolto questo impostando una classe come modulo. Ho avuto l'idea da questa risposta: Lazy module variables--can it be done?Proprietà modulo documento Sfinge
Volevo che fosse ripetibile e facile da usare, quindi ho creato un metaclasse per questo. Funziona come un fascino.
Il problema è che quando si utilizza Sphinx per generare proprietà della documentazione non viene documentato. Tutto il resto è documentato come previsto. Non ho idea di come risolvere questo problema, forse questo è un problema con Sphinx?
Il modulo:
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
E un copia-incolla per generare/visualizzare la documentazione Sfinge:
sphinx-apidoc . -o doc --full
sphinx-build doc html
xdg-open html/module.html
La parte più essenziale è quello di documentare le proprietà della classe. Punti bonus per documentare anche i membri del modulo originale.
MODIFICA: La classe deve essere documentata come il modulo in cui si trova. La classe viene utilizzata in questo modo e dovrebbe quindi apparire in questo modo in Sfinge.
Esempio di output desiderato:
Module Foo
TestClass docstring.
some_property
Property docstring.
meth()
meth doc
EDIT 2: ho trovato qualcosa che può aiutare a trovare una soluzione. Quando avere un modulo di regolare foo
con il seguente contenuto:
#: Property of foo
prop = 'test'
documenti Sphinx questo come:
foo.prop = 'test'
Property of foo
Le stesse opere se prop
è un attributo di una classe. Non ho capito perché non funziona nel mio caso particolare.
Il tuo codice non funziona. 'ModMeta' non è definito. Potresti per favore postare codice funzionante? – jterrace
@jterrace Copia-incolla fallita. È stato risolto ora ;-) – siebz0r
Ho eliminato la mia risposta perché il codice originale aveva '__metaclass_' invece di' __metaclass__', causandone il non funzionamento. – jterrace