2012-02-05 12 views
10

Quando uso Sfinge autodoc per documentare una classe, i valori per gli attributi vengono sempre segnalati, (come si dice dovrebbe here, sotto # 437), ma sempre come "= None"valori Sphinx per gli attributi riportati come Nessuno

Attribute = None 
    Some Documentation 

ho includerlo come

.. autoclass:: core.SomeClass 
    :members: 

E il mio codice è simile

class SomeClass(object): 
    def __init__(self): 
     self.attribute = "value" #: Some Documentation 

Esiste un modo per rendere "= None" il valore reale o farlo scomparire?

+0

dove stai vedendo '' = None''? – jterrace

+1

Qui, ad esempio: http://readthedocs.org/docs/domination-game/en/latest/games.html#domination.core.GameStats. Succede ovunque dove sto usando 'self.attribute = ...' in combinazione con 'autoclass :: ..: members:' – noio

risposta

4

Sono sicuro che questo ha a che fare con il fatto che il tuo attributo è un attributo di istanza. Non ottiene un valore fino a quando la classe non viene istanziata. Sfinge importa i moduli per ispezionarli, ma non istanzia nessuna classe.

Quindi il "valore reale" non è noto a Sphinx e viene emesso None. Non penso che tu possa farla andare via facilmente (ma suppongo che tutto sia possibile se sei pronto a patchare il codice sorgente di Sphinx ...). Se non ti piace, puoi invece documentare gli attributi nella docstring della classe.

Gli attributi di classe documentati utilizzando lo stesso schema di marcatura (described here) visualizzano i loro valori nell'output di rendering. Ma non c'è una chiara indicazione che renda facile per il lettore distinguere tra attributi di classe e istanza. Forse la Sfinge potrebbe essere un po 'più utile qui.

+0

Non penso che l'ipotesi di lavoro di questa risposta sia corretta. Sto riscontrando il problema (ad esempio: " = Nessuno" visualizzato nella documentazione generata) per gli attributi di classe definiti e inizializzati al di fuori della funzione __init __(). Questi sono documentati, usando la variante di commento "#: ..." posta dopo l'attributo sulla stessa linea. – dbanas

+0

Interessante. Hai un progetto GitHub o simile dove possiamo guardare questo? – mzjn

+0

Sì: https://github.com/capn-freako/PyBERT/blob/8c63d28220edc000e9503082e05c6257cd9cee7c/pybert/pybert.py#L315 – dbanas

8

Ci sarà un'opzione :annotation: (vedere pull-request) nella prossima versione 1.2 di sfinge (e nella seconda beta).

Per autodata/autoattribute è quindi possibile forzare un valore specifico o sopprimerlo. Quindi, al fine di stampare alcun valore per l'attributo che si metterebbe:

.. autoclass:: core.SomeClass 

    .. autoattribute:: attribute 
     :annotation: 

Attualmente funziona solo con autodata/autoattribute direttamente e non in modo ricorsivo con automodule/autoclass.

+0

Questo sembra funzionare solo con gli attributi di classe. Testato usando Sphinx 1.5.1 –

0

Questo sembra essere ancora un problema. Ho lavorato intorno ad esso con:

class ValueDoc: 

    def __init__(self, text): 
     self.text = text 

    def __repr__(self): 
     return self.text 

e quindi definire l'attributo a livello di classe come:

#: documentation for foo 
foo = ValueDoc('text to show up after =') 
0

non ero in grado di ottenere le annotazioni di lavoro per gli attributi di istanza. Ho scelto di nascondere solo i valori degli attributi nel mio tema.

Esempio html

<dl class="attribute"> 
    <dt> 
    <code class="descName">Attribute</code> 
    <em class="property"> = None</em> 
    </dt> 
</dl> 

Tema CSS per nascondere = None

dd dl.attribute em.property { display: none } 
+1

C'è una direttiva non documentata chiamata 'autoinstanceattribute' che puoi provare. Non è chiaro se questa direttiva abbia solo bisogno di essere documentata o se si supponga che "autoattribute" gestisca anche gli attributi di istanza. Vedi https://github.com/sphinx-doc/sphinx/issues/904#issuecomment-68577602. – mzjn

+0

Vedere anche http://stackoverflow.com/a/17676063/407651. – mzjn

+0

Quindi la direttiva '.. autoinstanceattribute' con l'opzione blank': annotation: 'elimina il valore con successo! Sembra che questa implementazione sia un po 'confusa con 1.5. –

2

Per la versione corrente di Sfinge, si può mettere un monkeypatch nel conf.py del progetto che risolve questo problema:

from sphinx.ext.autodoc import (
    ClassLevelDocumenter, InstanceAttributeDocumenter) 

def iad_add_directive_header(self, sig): 
    ClassLevelDocumenter.add_directive_header(self, sig) 

InstanceAttributeDocumenter.add_directive_header = iad_add_directive_header 

Questo è discusso in Sphinx issue #2044

+0

Correlati: http://stackoverflow.com/a/10870416/407651 – mzjn

Problemi correlati