Qual è il formato standard di docstring Python? [chiuso]


888

Ho visto alcuni stili diversi di scrivere dotstrings in Python, esiste uno stile ufficiale o "concordato"?


6
python.org/dev/peps/pep-0008 c'è un'intera sezione dedicata alle stringhe di documentazione
Mechanical_meat

30
Credo che la questione non era abbastanza chiaro perché PEP-257 e PEP-8 sono i stabilendo solo la base per docstrings, ma come su epydoc, doxygen, sphinx? Qualcuno ha delle statistiche, è uno di loro che sostituirà gli altri, in casi come questo troppe opzioni possono far male.
Sorin,

1
@sorin, vorrei anche sapere quale markup, se presente, è più comune. Ma penso che la risposta sia che nessuno di loro è davvero così comune: le persone tendono a preferire guardare direttamente la fonte Python, piuttosto che convertirla in HTML. Quindi, è molto utile essere coerenti, ma in un modo ottimizzato per la leggibilità umana e senza markup esplicito.
poolie,

3
PyCharm si completa automaticamente in un modo piuttosto interessante, che penso sia una buona implementazione delle istruzioni necessarie per eseguirlo:def foo(self, other):\n\t"""\n\t(blank line)\n\t:param other: \n\t:return:\n\t"""
Matteo Ferla

1
Quale di queste risposte è quella che funziona di default con il parser di documentazione VS Code?
William Entriken,

Risposte:


1019

formati

I docstring di Python possono essere scritti seguendo diversi formati, come mostrato dagli altri post. Tuttavia, il formato di dotstring predefinito Sphinx non è stato menzionato ed è basato su reStructuredText (reST) . Puoi ottenere alcune informazioni sui principali formati in questo post del blog .

Si noti che il reST è raccomandato dal PEP 287

Segue i principali formati utilizzati per i docstring.

- Epytext

Storicamente uno stile javadoc era prevalente, quindi è stato preso come base per Epydoc (con il Epytextformato chiamato ) per generare documentazione.

Esempio:

"""
This is a javadoc style.

@param param1: this is a first param
@param param2: this is a second param
@return: this is a description of what is returned
@raise keyError: raises an exception
"""

- riposo

Al giorno d'oggi, il formato probabilmente più diffuso è il formato reStructuredText (reST) utilizzato da Sphinx per generare documentazione. Nota: viene utilizzato per impostazione predefinita in JetBrains PyCharm (digitare virgolette triple dopo aver definito un metodo e premere invio). Viene anche utilizzato di default come formato di output in Pyment.

Esempio:

"""
This is a reST style.

:param param1: this is a first param
:param param2: this is a second param
:returns: this is a description of what is returned
:raises keyError: raises an exception
"""

- Google

Google ha il suo formato che viene spesso utilizzato. Può anche essere interpretato da Sphinx (cioè usando il plugin Napoleon ).

Esempio:

"""
This is an example of Google style.

Args:
    param1: This is the first param.
    param2: This is a second param.

Returns:
    This is a description of what is returned.

Raises:
    KeyError: Raises an exception.
"""

Ancora più esempi

- Numpydoc

Nota che Numpy consiglia di seguire il proprio numpydoc basato sul formato di Google e utilizzabile da Sphinx.

"""
My numpydoc description of a kind
of very exhautive numpydoc format docstring.

Parameters
----------
first : array_like
    the 1st param name `first`
second :
    the 2nd param
third : {'value', 'other'}, optional
    the 3rd param, by default 'value'

Returns
-------
string
    a value in a string

Raises
------
KeyError
    when a key error
OtherError
    when an other error
"""

Conversione / Generazione

È possibile utilizzare uno strumento come Pyment per generare automaticamente docstring in un progetto Python non ancora documentato, o convertire i dotstring esistenti (possono mescolare diversi formati) da un formato a un altro.

Nota: gli esempi sono tratti dalla documentazione di Pyment


10
Potrei aggiungere che reST è ciò che viene utilizzato per impostazione predefinita in JetBrains PyCharm, basta digitare le virgolette triple dopo aver definito il metodo e premere invio. jetbrains.com/pycharm/help/creating-documentation-comments.html
Felipe Almeida,

12
La risposta più completa, include un senso della storia e delle migliori pratiche attuali. Ora tutto ciò di cui abbiamo bisogno è un certo senso di movimento della comunità verso un nuovo formato "migliore" e qualche ulteriore sforzo della comunità verso la creazione di strumenti di migrazione da tutti gli altri a quello nuovo, in modo da poter effettivamente sviluppare le migliori pratiche.
Bob, il

2
yo @daouzli, il link in stile google è 404. Credo che questo sia corretto. Puoi anche aggiungere l' esempio dello stile Sfinge di Google . Ottima risposta tra l'altro. EDIT: ho modificato la tua risposta da solo.
voy

4
buona risposta. Oserei dire dove è possibile modificare il formato predefinito di Docstring in PyCharm (JetBrains): Impostazioni -> Strumenti -> Strumenti integrati Python -> Formato Docstring. In bocca al lupo!
Jackssn,

4
Sono sorpreso che nessuno abbia commentato la prima riga di testo: attualmente è strettamente corretto, ma mi sento come il modo preferito è quello di posizionarlo sulla prima riga subito dopo le virgolette triple. PEP 8 e PEP 257 lo fanno in quasi tutti i loro esempi. PEP 287 fa a modo tuo, ma nella mia esperienza non è così comune.
Lapinot,

323

La guida di stile di Google contiene un'eccellente guida di stile di Python. Include convenzioni per la sintassi di docstring leggibile che offre una guida migliore rispetto a PEP-257. Per esempio:

def square_root(n):
    """Calculate the square root of a number.

    Args:
        n: the number to get the square root of.
    Returns:
        the square root of n.
    Raises:
        TypeError: if n is not a number.
        ValueError: if n is negative.

    """
    pass

Mi piace estenderlo per includere anche informazioni sul tipo negli argomenti, come descritto in questo tutorial sulla documentazione di Sphinx . Per esempio:

def add_value(self, value):
    """Add a new value.

       Args:
           value (str): the value to add.
    """
    pass

37
Trovo lo stile "firma in docstrings" terribilmente ridondante e dettagliato. Per Python 3+, le annotazioni delle funzioni sono un modo molto più pulito per farlo. Ancora peggio se usa tipi pseudo-forti: Python è molto meglio con la tipizzazione anatra.
Evpok,

27
sì, ma almeno dà un indizio di che tipo di anatra è prevista, e la maggior parte degli sviluppatori non è ancora su Python 3
Anentropic,

3
@Evpok personalmente, non mi piacciono le annotazioni di funzioni. Per usare le classi in esse potresti dover fare importazioni non necessarie, per usare le stringhe potresti esaurire molto rapidamente lo spazio orizzontale descrivendole. Finora non ho visto il punto di usarli per nulla.
OdraCodificato

5
@Nathan, la guida di stile di Google raccomanda commenti descrittivi piuttosto che dichiarativi, ad esempio "Recupera righe da una tabella" su "Recupera righe da una tabella". Pertanto, la modifica di "Calcola ..." in "Calcola ..." renderebbe il tuo esempio più coerente con il resto del commento, ad esempio "Restituisce" e "Aumenta".
Gwg,

2
nit: Seguendo lo stile di Google, usa una forma descrittiva piuttosto che imperativa, ovvero "Calcola ..." e "Aggiunge ..."
sbeliakov

228

Le convenzioni di Docstring sono in PEP-257 con molti più dettagli di PEP-8.

Tuttavia, le dotstring sembrano essere molto più personali di altre aree di codice. Diversi progetti avranno il loro standard.

Tendo a includere sempre i docstring, perché tendono a dimostrare come utilizzare la funzione e cosa fa molto rapidamente.

Preferisco mantenere le cose coerenti, indipendentemente dalla lunghezza della stringa. Mi piace l'aspetto del codice quando rientro e spaziatura sono coerenti. Ciò significa che io uso:

def sq(n):
    """
    Return the square of n. 
    """
    return n * n

Al di sopra di:

def sq(n):
    """Returns the square of n."""
    return n * n

E tende a smettere di commentare la prima riga in docstrings più lunghi:

def sq(n):
    """
    Return the square of n, accepting all numeric types:

    >>> sq(10)
    100

    >>> sq(10.434)
    108.86835599999999

    Raises a TypeError when input is invalid:

    >>> sq(4*'435')
    Traceback (most recent call last):
      ...
    TypeError: can't multiply sequence by non-int of type 'str'

    """
    return n*n

Significato: trovo che le dotstring che iniziano in questo modo siano disordinate.

def sq(n):
    """Return the squared result. 
    ...

90
Si noti che PEP-8 afferma specificamente che i docstring dovrebbero essere scritti come comandi / istruzioni, piuttosto che descrizioni, ad es. """Return the squared result"""piuttosto che """Returns the squared result""". Anche se personalmente, scrivo il mio come sono qui Tim, nonostante ciò che dice il PEP.
Cam Jackson,

63
Inoltre non sono d'accordo con quel consiglio (usando il tempo imperativo) perché inizia a sembrare imbarazzante per qualcosa di più di una frase. Inoltre, stai descrivendo una funzione, non stai dicendo al lettore cosa fare.
MK12,

14
Nota: la specifica per i docstring prescrittivi piuttosto che descrittivi appare in realtà in PEP-257 , non in PEP-8. Vengo da una tradizione di Java, in cui descrivevo le funzioni, ma alla fine ho iniziato a usare il tempo imperativo quando il mio paradigma di programmazione è passato dall'orientamento agli oggetti a quello procedurale. E quando ho iniziato a usare pycco per generare documentazione in stile letterato-programmazione, è diventato molto chiaro il motivo per cui è stato suggerito il tempo imperativo. Dovresti scegliere in base al tuo paradigma.
karan.dodia,

26
L'imperativo è un umore grammaticale . (Mi dispiace.)
Denis Drescher,

5
@ Mk12 I messaggi di commit di Git dovrebbero anche essere scritti come comandi anziché come descrizioni. E stanno anche " descrivendo " un cambio di codice, "non dicendo al lettore cosa fare". Quindi penso che sia solo una convenzione scrivere descrizioni come comandi.
pezzo

58

Come apparentemente nessuno lo ha menzionato: puoi anche usare lo standard Numpy Docstring . È ampiamente usato nella comunità scientifica.

L'estensione della sfinge napoletana per analizzare i docstring in stile Google (consigliata nella risposta di @Nathan) supporta anche il docstring in stile Numpy e fa un breve confronto di entrambi.

E infine un esempio di base per dare un'idea di come appare:

def func(arg1, arg2):
    """Summary line.

    Extended description of function.

    Parameters
    ----------
    arg1 : int
        Description of arg1
    arg2 : str
        Description of arg2

    Returns
    -------
    bool
        Description of return value

    See Also
    --------
    otherfunc : some related other function

    Examples
    --------
    These are written in doctest format, and should illustrate how to
    use the function.

    >>> a=[1,2,3]
    >>> print [x + 3 for x in a]
    [4, 5, 6]
    """
    return True

2
Formato NumPy IMHO occupa troppo spazio verticale che è scarso sui monitor widescreen (tranne per il fatto che ne usi uno ruotato di 90 gradi, ma immagino che la maggior parte delle persone non lo faccia) Quindi, il Formato Google IMHO è una buona scelta in termini di leggibilità e funzionalità.
Semanino,

3
Suppongo che sia in qualche modo soggettivo. Una volta che hai una docstring più complessa (con sezioni diverse, con esempi, ecc., Quindi occupando comunque molto spazio verticale indipendentemente dal formato), trovo il formato numpydoc più facile da leggere / meglio strutturato.
joris,

2
Personalmente ritengo che una docstring così lunga sia meglio posizionata nella documentazione, non nel codice sorgente, se è così lunga da impedire la leggibilità del modulo.
Jonathan Hartley,

12

PEP-8 è lo standard ufficiale di codifica Python. Contiene una sezione su dotstrings, che fa riferimento a PEP-257 - una specifica completa per docstrings.


8
Menzionare PEP-257 nel contesto di "come dovrei documentare correttamente i parametri, i valori di ritorno, le eccezioni sollevate ecc." È un JOKE - non dice una sola parola su di essi (sebbene un esempio di codice ne mostri alcuni). Il formato Google IMHO è una buona scelta in termini di leggibilità e funzionalità.
Semanino,

9

È Python; tutto va bene . Valuta come pubblicare la tua documentazione . Docstrings sono invisibili ad eccezione dei lettori del tuo codice sorgente.

Alla gente piace molto navigare e cercare documentazione sul web. Per farlo, usa lo strumento di documentazione Sphinx . È lo standard di fatto per la documentazione di progetti Python. Il prodotto è bellissimo: dai un'occhiata a https://python-guide.readthedocs.org/en/latest/ . Il sito web Leggi i documenti ospiterà i tuoi documenti gratuitamente.


22
Uso regolarmente ipythonper testare una libreria e rende la lettura dei documenti molto semplice: tutto quello che devo scrivere è your_module.some_method_im_curious_about?e ottengo una bella stampa, incluso il documento.
Thanatos,

8
È probabile che gli utenti di una libreria o di un'API o che stanno scrivendo un plugin guardino il codice e debbano dargli un senso. Trovo che i commenti siano molto più cruciali in Python che in Java o C # perché i tipi non sono dichiarati. Aiuta molto se i commenti danno un'idea di quali tipi di anatre vengono passati e restituiti. (Altrimenti, devi effettivamente camminare tutto il codice e calcolare che un determinato parametro deve ... essere iterabile qui ... supporta l'indicizzazione laggiù ... supporta la sottrazione numerica alla fine ... Ah! È fondamentalmente un int array. Un commento avrebbe aiutato!)
Jon Coombs

Eh, no. Docstrings non sono invisibili e questo è un po 'il punto. Puoi vedere il docstring se esegui la helpfunzione sulla funzione / metodo / classe documentata (e ciò puoi fare anche se hai accesso solo al modulo compilato). Personalmente penso che uno dovrebbe tenerlo presente quando si sceglie la convenzione dotstring (cioè che si intende leggere così com'è).
skyking

7

Io suggerisco di usare di Vladimir Keleshev pep257 programma Python per controllare i docstrings contro PEP-257 e il Numpy docstring standard per la descrizione dei parametri, i rendimenti, ecc

pep257 segnalerà la divergenza che si fa dallo standard e si chiama come pylint e pep8.


Menzionare PEP-257 nel contesto di "come dovrei documentare correttamente i parametri, i valori di ritorno, le eccezioni sollevate ecc." È un JOKE - non dice una sola parola su di essi (sebbene un esempio di codice ne mostri alcuni). Formato NumPy IMHO occupa troppo spazio verticale che è scarso sui monitor widescreen (tranne per il fatto che ne usi uno ruotato di 90 gradi, ma immagino che la maggior parte delle persone non lo faccia) Quindi, il Formato Google IMHO è una buona scelta in termini di leggibilità e funzionalità.
Semanino,

1
@Semanino Sto citando lo standard Numpy Docstring nel contesto del programma pep257, - non PEP-257. Quel programma ora si chiama pydocstyle. pydocstyle ti consente di eseguire alcuni controlli numpydoc, ad esempio pydocstyle --select=D4 tmp.pycontrolli per una serie di problemi relativi al contenuto di docstring, inclusa la denominazione delle sezioni.
Finn Årup Nielsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.