Post Image

Formati di Docstring in Python: Google, Sphinx e NumPy a Confronto

Nel corso della serie di articoli denominata Docstring in Python, abbiamo già esplorato diversi aspetti fondamentali per scrivere docstring efficaci e per migliorare la documentazione del nostro codice. Abbiamo iniziato con l’articolo Docstring in Python: Best Practice, Esempi e Strumenti di Validazione, dove abbiamo discusso le regole generali da seguire per mantenere una documentazione leggibile, chiara e conforme agli standard. Successivamente, abbiamo approfondito come utilizzare pydocstyle per validare automaticamente le docstring nel nostro codice, con l'articolo Migliora la Documentazione del Tuo Codice Python con pydocstyle. Infine, con Flake8-Docstrings: Guida Completa alla Validazione Automatica delle Docstring in Python, abbiamo visto come integrare la validazione nel nostro flusso di lavoro quotidiano utilizzando uno strumento versatile come Flake8.

In questa nuova tappa, ci concentreremo sui formati di docstring comunemente utilizzati in Python, ognuno con le sue peculiarità e il suo stile specifico. I tre principali formati che affronteremo sono: Google, Sphinx e NumPy. Ognuno di questi formati ha caratteristiche che lo rendono più adatto a diversi contesti e preferenze, ma la scelta del formato giusto dipende soprattutto dalle esigenze del team di sviluppo o dalle linee guida del progetto. Vedremo come questi stili differiscono tra loro, fornendo anche esempi pratici per ognuno.

Il formato Google

Il formato Google per le docstring è forse il più immediato e leggibile. Questo stile si distingue per la sua semplicità e chiarezza, puntando su una struttura facilmente comprensibile sia dagli sviluppatori che dagli strumenti automatici. La documentazione di ciascuna funzione, classe o metodo viene suddivisa in sezioni chiaramente etichettate come Args, Returns e Raises. La scelta di Google di utilizzare questi tag aiuta a rendere le docstring concise e facilmente navigabili.

Ad esempio, una funzione documentata in formato Google potrebbe apparire così:

def somma(a, b):
    """
    Calcola la somma di due numeri.

    Args:
        a (int): Il primo numero.
        b (int): Il secondo numero.

    Returns:
        int: La somma di a e b.
    """
    return a + b

In questo caso, la sezione Args descrive i parametri di input della funzione, mentre Returns spiega ciò che la funzione restituisce. La struttura è semplice e chiara, permettendo a chiunque di capire rapidamente come utilizzare la funzione e cosa aspettarsi in termini di output.

Il formato Sphinx (reStructuredText)

Il formato Sphinx, basato sul linguaggio reStructuredText (RST), è estremamente flessibile e potente. È il formato prediletto per progetti di grande portata e quando si desidera generare automaticamente documentazione completa e ben formattata. Uno dei punti di forza di Sphinx è la sua integrazione con strumenti per la generazione di documentazione, come lo stesso Sphinx, che permette di produrre documenti in HTML, PDF e molti altri formati.

A differenza del formato Google, Sphinx utilizza marcatori più specifici per definire le sezioni di una docstring. Questo approccio lo rende leggermente più verboso, ma anche più strutturato, il che può essere utile in progetti di larga scala.

Ecco un esempio di come potrebbe apparire una docstring in formato Sphinx:

def sottrai(a, b):
    """
    Sottrae il secondo numero dal primo.

    :param a: Il primo numero.
    :type a: int
    :param b: Il secondo numero.
    :type b: int
    :return: La differenza tra a e b.
    :rtype: int
    """
    return a - b

Come si può notare, ogni sezione è etichettata con una specifica direttiva, come :param per i parametri, :type per specificare il tipo, e :return per descrivere il valore restituito. Questo stile rende la documentazione molto precisa e standardizzata, ideale quando si lavora in ambienti che richiedono un'attenzione particolare alla forma e alla coerenza.

Il formato NumPy

Il formato NumPy è molto popolare nel mondo scientifico e tra i progetti che richiedono una documentazione particolarmente dettagliata. Simile allo stile Google in termini di semplicità, NumPy adotta una convenzione leggermente diversa per la presentazione delle informazioni. Le sezioni come Parameters, Returns e Raises sono ampiamente utilizzate, ma con una maggiore attenzione alla descrizione dei tipi e delle eccezioni.

Un esempio di docstring in formato NumPy potrebbe essere il seguente:

def moltiplica(a, b):
    """
    Moltiplica due numeri.

    Parameters
    ----------
    a : int
        Il primo numero.
    b : int
        Il secondo numero.

    Returns
    -------
    int
        Il prodotto di a e b.
    """
    return a * b

La differenza principale qui sta nell'utilizzo delle sezioni Parameters e Returns, con un formato che ricorda le specifiche di un manuale tecnico. Questo stile rende la docstring particolarmente adatta per chi lavora in statistica, matematica o altre discipline tecniche, dove la precisione dei tipi di dati è fondamentale.

Conclusione

Ognuno di questi formati ha i propri vantaggi. Il formato Google è probabilmente il più leggibile e conciso, ideale per progetti che richiedono una documentazione snella ma chiara. Il formato Sphinx, grazie alla sua flessibilità, si presta molto bene a progetti di grande portata che necessitano di una documentazione automatizzata e multi-formato. Infine, il formato NumPy si distingue per la sua precisione e la sua popolarità nel contesto scientifico e tecnico, offrendo una descrizione dettagliata e accurata dei parametri e dei tipi di dati.

La scelta del formato giusto dipende dalle tue esigenze di progetto, dal contesto in cui lavori e dalle preferenze del team. Indipendentemente dal formato scelto, è fondamentale mantenere una coerenza nella documentazione del codice, affinché questa rimanga leggibile e facilmente navigabile, non solo per te stesso, ma anche per i tuoi colleghi e per chiunque dovrà utilizzare o manutenere il codice in futuro.