2010-02-03 9 views
11

preferisco documentare ogni parametro (se necessario) sulla stessa linea in cui dichiaro il parametro al fine di applicare D.R.Y.In Sphinx, c'è un modo per documentare i parametri e dichiararli?

Se ho il codice come questo:

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    ... 

Come posso evitare di ripetere la parametri nella stringa doc e mantengono le spiegazioni dei parametri?

voglio evitare:

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    '''Foo does whatever. 

    * flab_nickers - a series of under garments to process 
    * needs_pressing - Whether the list of garments should all be pressed. 
     [Default False.] 

Questo è possibile in Python 2.6 o Python 3 con una sorta di manipolazione decoratore? C'è un altro modo?

+0

Se il tuo RST è abbastanza pulito (i 'param' di Sphinx in realtà non aiutano), dovrebbe essere abbastanza semplice da guardare la definizione della funzione e poi verso il basso nella docstring. Escludo lo stile predefinito di Sphinx (con i suoi 'param's) e scelgo lo stile di Google che sembra * di gran lunga migliore * nel codice, e comunque decente quando renderizzato ([questa domanda] (http://stackoverflow.com/a/11176267/194586) parla di come ottenere il meglio da entrambi i mondi). –

risposta

8

Lo farei.

A partire da questo codice.

def foo(
     flab_nickers, # a series of under garments to process 
     has_polka_dots=False, 
     needs_pressing=False # Whether the list of garments should all be pressed 
    ): 
    ... 

avrei scritto un parser che afferra le definizioni dei parametri funzione e costruisce il seguente:

def foo(
     flab_nickers, 
     has_polka_dots=False, 
     needs_pressing=False, 
    ): 
    """foo 

    :param flab_nickers: a series of under garments to process 
    :type flab_nickers: list or tuple 
    :param has_polka_dots: default False 
    :type has_polka_dots: bool 
    :param needs_pressing: default False, Whether the list of garments should all be pressed 
    :type needs_pressing: bool 
    """ 
    ... 

Ecco alcune elaborazioni regex abbastanza straight-forward dei modelli di vari argomenti stringa di compilare il modello di documentazione .

Un sacco di buoni IDE Python (ad esempio PyCharm) comprendono la notazione Sphinx predefinita param e persino flag var/metodi nell'ambito che IDE ritiene non conforme al tipo dichiarato.

Annotare la virgola aggiuntiva nel codice; questo è solo per rendere le cose coerenti. Non fa male, e potrebbe semplificare le cose in futuro.

È inoltre possibile provare e utilizzare il compilatore Python per ottenere un albero di analisi, modificarlo ed emettere il codice di aggiornamento. L'ho fatto per altri linguaggi (non Python), quindi ne conosco un po ', ma non so quanto sia supportato in Python.

Inoltre, questa è una trasformazione una tantum.

I commenti originali in-line nella definizione della funzione non seguono realmente DRY perché si tratta di un commento, in un linguaggio informale, e inutilizzabile con strumenti diversi ma sofisticati.

I commenti di Sfinge sono più vicini a DRY perché sono nel linguaggio di marcatura RST, rendendoli molto più facili da elaborare utilizzando normali strumenti di analisi del testo in docutils.

È ASCIUTTO solo se gli strumenti possono farne uso.

Link utili: https://pythonhosted.org/an_example_pypi_project/sphinx.html#function-definitions http://sphinx-doc.org/domains.html#id1

+2

[The Python Docs per 'an_example_pypi_project'] (http://packages.python.org/an_example_pypi_project/sphinx.html#full-code-example) mostra le opzioni di formattazione di Sphinx docstring. –

+0

No, il commento in quel documento non funzionerà: "Arg: nome (str): il nome da utilizzare." – MeaCulpa

1

Non si può farlo senza un preprocessore, come commenti non esistono per Python una volta che la sorgente è stato compilato. Per evitare di ripetere te stesso, rimuovere i commenti e documentare i parametri solo nella docstring, questo è il modo standard per documentare i tuoi argomenti.

+0

Forse è una cattiva abitudine, ma ho acquisito il gusto per la documentazione in linea dopo aver usato Verilog (linguaggio di progettazione hardware) dove gli elenchi di parametri per i moduli di livello superiore possono avere un centinaio di parametri. Quindi, se si mette la documentazione dei parametri di Verilog lontana dalla linea di documentazione dei parametri effettiva, potrebbero essere separati da 100 linee, il che è davvero negativo per la manutenibilità. –

+0

E per questi moduli di verilog di alto livello ci sono molte persone che modificano questo file, quindi non puoi fare affidamento sul fatto che le persone siano dei buoni cittadini. Ad ogni modo, potresti avere ragione. Potrebbe essere un piolo quadrato in un buco rotondo. –

+0

@Ross Rogers: Sfinge identificherà i cattivi cittadini per te. Se: nome param: non corrisponde agli argomenti effettivi, si ricevono avvisi. –

5

annotazioni hanno lo scopo di affrontare in parte questo problema in Python 3:

http://www.python.org/dev/peps/pep-3107/

non sono sicuro se c'è stato alcun lavoro in applicazione di questi per Sfinge ancora.

+0

Ho guardato il codice Sphinx proprio oggi, e posso confermare che Sphinx ha il supporto per le annotazioni di ritorno. Le annotazioni sul tipo di parametro sono in qualche modo presenti, ma al momento sembrano per lo più rudimentali. – obskyr

Problemi correlati