Corso
Il coding è l’arte di scrivere le istruzioni – note anche come algoritmi – affinché un computer svolga un compito specifico. Per comunicare con i computer, gli sviluppatori usano i linguaggi di programmazione.
Proprio come le lingue naturali, come l’inglese, il russo o il quechua, i linguaggi di programmazione hanno un insieme specifico di regole sintattiche e semantiche che forniscono le basi per la comunicazione. Sebbene le lingue naturali siano più complesse, flessibili e dinamiche, questi attributi si applicano, in misura più limitata, anche ai linguaggi di programmazione.
Anche l’algoritmo più semplice può essere scritto in molti modi diversi. Se da un lato una certa flessibilità è auspicabile nello sviluppo del codice, dall’altro può compromettere l’efficienza e la comunicazione efficace, soprattutto quando ci lavorano più persone.
Per questo motivo, la leggibilità è un aspetto fondamentale nella scrittura del codice. Per assicurare che gli sviluppatori siano allineati, la maggior parte dei linguaggi di programmazione ha sviluppato degli standard di codifica. Questi documenti forniscono linee guida e best practice per produrre codice leggibile, mantenibile e scalabile.
In questo articolo scopriremo le best practice per scrivere codice in Python, uno dei linguaggi più popolari nella data science. Le pratiche presentate nelle sezioni seguenti sono per lo più basate su PEP 8, la guida standard per scrivere codice in Python.
Dai un’occhiata al nostro articolo o al corso Introduzione a Python per scoprire di più su come si usa Python.
Che cos’è PEP 8?
“Il codice viene letto molto più spesso di quanto venga scritto. Il codice dovrebbe sempre essere scritto in modo da promuoverne la leggibilità” – Guido van Rossum, l’inventore di Python
PEP 8 è una guida di stile per il codice Python. Scritto nel 2001 da Guido van Rossum, Barry Warsaw e Nick Coghlan, fornisce una serie di raccomandazioni per scrivere codice più leggibile e coerente. Copre tutto: da come nominare le variabili al numero massimo di caratteri che dovrebbe avere una riga.
PEP sta per Python Enhancement Proposal. Un PEP è un documento che descrive le nuove funzionalità proposte per Python e documenta aspetti di Python, come progettazione e stile.
Anche se non è obbligatorio, gran parte della community Python usa PEP 8. È quindi altamente consigliabile seguire le linee guida. Così facendo, migliorerai le tue credenziali come programmatore professionista.
Nonostante l’ampia adozione di PEP 8, le linee guida potrebbero non adattarsi a tutti gli scenari particolari. In questi casi, le aziende spesso definiscono le proprie convenzioni.
Best practice di Python
1. Best practice di Python per la qualità del codice
Scrivere codice leggibile e organizzato può fare la differenza e migliorare le tue prospettive di carriera. Anche se il coding può sembrare un processo meccanico e complesso per i principianti, la verità è che il coding è un’arte.
Ci sono molti consigli che puoi seguire per aumentare la qualità del codice in Python. Ecco un elenco di alcuni dei più rilevanti.
La tirannia dell’indentazione
L’indentazione si riferisce agli spazi all’inizio di una riga di codice. Mentre in altri linguaggi di programmazione l’indentazione serve solo a migliorare la leggibilità, in Python è obbligatoria. Python usa l’indentazione per aprire un blocco di codice. Più precisamente, 4 spazi consecutivi per livello di indentazione, come mostrato nel seguente codice:
for number in [1,2,3,4]:
if number % 2 == 0:
print(number)
else:
continue
Lunghezza massima della riga
PEP 8 raccomanda che nessuna riga superi i 79 caratteri. Ha senso: le righe più corte sono più facili da leggere. Inoltre, questa lunghezza ti permette di avere più file aperti uno accanto all’altro.
Righe vuote
Circonda le definizioni di funzioni e classi di primo livello con due righe vuote. Le definizioni dei metodi all’interno di una classe sono separate da una singola riga vuota. Righe vuote extra possono essere usate (con parsimonia) per separare gruppi di funzioni correlate. Infine, usa righe vuote nelle funzioni (con parsimonia) per indicare sezioni logiche.
Usa linters e autoformatter
La padronanza del codice richiede tempo. Prestare attenzione a tutti i dettagli mentre si scrive può essere impegnativo e dispendioso. Per fortuna, le macchine, in particolare linters e formatter, possono aiutarci a garantire la qualità del codice.
I linters eseguono un’analisi statica del sorgente e verificano discrepanze semantiche. I formatter sono strumenti simili che cercano di ristrutturare spaziatura del codice, lunghezza delle righe, posizionamento degli argomenti e così via, per assicurare che il tuo codice abbia un aspetto coerente tra file o progetti diversi. Python ti offre una pletora di linters e formatter tra cui scegliere.
Tieni a mente i principi
Alcune delle regole sopra menzionate sono lineari, ma spesso il coding riguarda il buon gusto e l’intuizione. Per diventare un artista del codice, dovresti conoscere alcuni dei principi alla base di Python. Un ottimo esempio è lo Zen di Python, trattato in un articolo a parte.
2. Best practice di Python per il logging
Il logging è un modo per tracciare gli eventi che accadono quando un software è in esecuzione. Soprattutto quando le applicazioni crescono in dimensioni e complessità, il logging diventa una tecnica fondamentale per sviluppare, effettuare il debug, eseguire e monitorare le prestazioni.
Il modulo logging fa parte della Libreria Standard di Python dalla versione 2.3 per affrontare le pratiche di logging. È il primo pacchetto di riferimento per la maggior parte degli sviluppatori Python in materia di logging e è descritto ampiamente in PEP 282.
Il logging è simile, nello spirito, a una funzione di stampa. Tuttavia, una print manca di molte informazioni che potrebbero essere utili a uno sviluppatore. Il logging, invece, può registrare timestamp e numero di riga in cui si è verificato l’errore. Può anche scrivere errori o altre informazioni su file, socket, ecc.
Per importare il modulo, ti basta eseguire questo codice:
import logging
Non tutti i messaggi di log sono uguali. Il modulo fornisce infatti una categoria di livelli di logging in base alla gravità del messaggio. Sono i seguenti:
- NOTSET (0): significa che tutti i messaggi verranno registrati.
- Debug (10): utile per diagnosticare problemi nel codice.
- Info (20): può essere usato per confermare che non ci sono bug nel codice. Un buon caso d’uso del logging a livello info è tracciare l’avanzamento dell’addestramento di un modello di machine learning.
- Warning (30): indicativo di un problema che potrebbe verificarsi in futuro. Per esempio, potrebbe essere emesso un warning per un modulo che potrebbe essere deprecato in futuro o un avviso di poca RAM.
- Error (40): un bug serio nel codice; potrebbe essere un errore di sintassi, un out-of-memory o un’eccezione.
- Critical (50): un errore a causa del quale il programma potrebbe smettere di funzionare o terminare in modo anomalo.
import logging
logging.info('This message is just informative')
logging.debug('My missions is to provide information about debugging.')
logging.critical("A Critical Logging Message")
Detto questo, qui sotto trovi un elenco di sei best practice per gestire il logging in Python.
Usa i log invece delle print
Abbiamo detto che i log forniscono informazioni in modo simile alle print. Tuttavia, i log sono molto più potenti e possono offrire informazioni più granulari.
Può essere allettante ricorrere alla funzione print, soprattutto se non hai familiarità con le routine di logging, ma i log saranno sempre l’opzione più sicura. Sono più adatti a scalare e a gestire applicazioni complesse.
Il web è pieno di guide e documentazione. Per esempio, questo tutorial sul logging di DataCamp potrebbe fare al caso tuo per iniziare.
Usa il modulo logging
Questo modulo è l’opzione di riferimento per la maggior parte degli sviluppatori Python. Ciò significa che è ben mantenuto e supportato da una community enorme che avrà sempre una risposta ai tuoi dubbi.
Scegli con attenzione il livello di logging
Il modulo logging prevede sei livelli diversi di messaggi. Ognuno è pensato per uno scopo specifico. Più ti attieni a essi, più sarà facile per te e per gli utenti capire cosa sta succedendo nel tuo codice.
Usa i timestamp nel logging
Questa è una caratteristica fondamentale dei log che le print non hanno. Oltre a sapere dove è comparso un problema, è importante sapere quando è accaduto. I timestamp sono i tuoi migliori alleati in queste situazioni. Assicurati di usare il formato standard per scriverli, cioè l’ISO-8601.
Svuota il cestino dei log
Usa classi RotatingFileHandler, come TimedRotatingFileHandler, invece di FileHandler, per archiviare, comprimere o eliminare i file di log vecchi ed evitare problemi di spazio. Queste classi liberano spazio una volta raggiunto un limite di dimensione o soddisfatta una condizione temporale.
3. Best practice di Python per i commenti
I commenti sono molto importanti per lasciare annotazioni ai futuri lettori del nostro codice. Sebbene sia difficile definire come il codice debba essere commentato, ci sono alcune linee guida che possiamo seguire:
- Qualsiasi commento che contraddice il codice è peggio di nessun commento. Per questo è molto importante aggiornare codice e commenti per evitare incongruenze.
- I commenti devono essere frasi complete, con la prima lettera maiuscola.
- Cerca di scrivere i commenti in inglese. Anche se ognuno è libero di scriverli nella lingua che ritiene opportuna, è consigliato usare l’inglese.
- Assicurati che i tuoi commenti siano chiari e facilmente comprensibili a chi parla la lingua in cui stai scrivendo.
Esistono due tipi di commenti: commenti a blocco e commenti inline.
Un commento a blocco spiega il codice che lo segue. In genere, si rientra il commento a blocco allo stesso livello del blocco di codice. Ogni riga di un commento a blocco inizia con un # e uno spazio singolo, come segue:
# This is a block comment
print('Welcome to DataCamp!")
I commenti inline, invece, compaiono alla stessa altezza del codice. I commenti inline dovrebbero essere separati dall’istruzione da almeno due spazi. Analogamente a un commento a blocco, un commento inline inizia con un singolo cancelletto (#) ed è seguito da uno spazio e da una stringa di testo.
print ("Have you ever tried Python?") # This is an inline comment
4. Best practice di Python per le docstring
Una docstring è una stringa letterale che compare come prima istruzione nella definizione di un modulo, funzione, classe o metodo. In genere, si usa una stringa di documentazione per generare automaticamente la documentazione del codice. In quanto tale, una docstring può essere accessibile a runtime tramite l’attributo speciale obj.__doc__ di quell’oggetto.
Per coerenza, le docstring sono sempre racchiuse tra triple virgolette doppie (""").
Esistono due forme di docstring: monoriga e multiriga. Le monoriga sono per casi davvero ovvi. Dovrebbero stare davvero su una sola riga. Il seguente esempio illustra una docstring monoriga nella funzione multiply():
def multiply(x, y):
""" Return the product of two numbers """
result = x * y
return result
Le docstring multiriga, invece, possono estendersi su più righe. Una docstring di questo tipo dovrebbe documentare la funzione dello script, la sintassi da riga di comando, le variabili d’ambiente e i file. I messaggi di utilizzo possono essere piuttosto elaborati e dovrebbero essere sufficienti per permettere a un nuovo utente di usare correttamente il comando.
def calculate_salary(hours, price=20):
""" Return the salary according to the hours worked
Arguments:
hours: total hours investe
price: price of each hours worked. Minimum price is 20 dollars
"""
salary = hours * price
return salary
Una spiegazione più dettagliata delle docstring è disponibile in PEP257.
5. Best practice di Python per la documentazione
Se i commenti sono importanti per aiutare altri sviluppatori con cui lavori a capire il tuo codice, la documentazione serve ad aiutare una community di potenziali utenti a imparare a usare il tuo software. Questo è un passaggio fondamentale: non importa quanto sia buono il tuo software, se la documentazione non è abbastanza valida, o peggio, manca, le persone non lo useranno.
Includere un file README è sempre una buona pratica, specialmente se stai lavorando a un nuovo progetto. Questi file sono normalmente il punto d’ingresso principale per chi legge il tuo codice e includono informazioni generali sia per gli utenti sia per i manutentori del progetto.
Anche se conciso, il file README dovrebbe spiegare lo scopo del progetto, l’URL della fonte principale del software e le informazioni sui crediti.
Allo stesso modo, dovresti sempre includere un file setup.py, assicurandoti che il software o la libreria siano stati impacchettati e distribuiti con Distutils, lo standard per distribuire moduli Python.
Inoltre, se il tuo software richiede altre dipendenze o pacchetti per essere eseguito, dovresti includere un file requirements.txt che descriva le dipendenze necessarie e le loro versioni.
Infine, sei libero di aggiungere qualsiasi altra informazione ritieni rilevante per i potenziali utenti. Per esempio, è una buona pratica fornire esempi di come funziona il tuo pacchetto o le tue funzioni.
6. Best practice di Python per gli ambienti virtuali
Per garantire ordine e coerenza nei tuoi progetti di dati, è una buona pratica creare un ambiente virtuale per ogni progetto che inizi.
Gli ambienti virtuali, noti anche come virtualenv, aiutano a disaccoppiare e isolare le versioni di Python e le librerie richieste per il tuo progetto e le relative versioni di pip. Questo consente agli utenti finali di installare e gestire il proprio set di software e versioni in modo indipendente da quelli forniti dal sistema.
Per creare i virtualenv, dobbiamo prima installare il pacchetto richiesto, scrivendo la seguente riga di codice nel terminale:
pip install virtualenv
Per creare un nuovo virtualenv, il seguente comando farà la magia. Stiamo chiamando il nuovo virtualenv “new_venv”
python3 -m venv /path/to/new/virtual/environment/new_venv
Convenzioni di naming in Python
Uno degli errori più comuni tra gli sviluppatori Python alle prime armi è l’assegnazione impropria dei nomi a variabili, classi, funzioni, ecc. Le convenzioni di naming sono elementi fondamentali per garantire la leggibilità del codice.
PEP 8 spiega il modo standard di nominare gli oggetti in Python. Secondo le linee guida, i nuovi moduli e pacchetti (inclusi i framework di terze parti) dovrebbero essere scritti secondo questi standard, ma dove una libreria esistente ha uno stile diverso si preferisce la coerenza interna.
Dovresti evitare nomi troppo generici o troppo prolissi. Inoltre, gli identificatori usati nella libreria standard devono essere compatibili con ASCII, come descritto in PEP 3131.
# Bad naming:
data_structure, ríos_españa, dictionary_with_countries_and_capitals
# Good naming:
user_profile, stop_words, global_emissions_df
Di seguito trovi un elenco delle convenzioni di naming per gli oggetti più comuni in Python.
- Pacchetti e moduli
- I nomi dei pacchetti e dei moduli dovrebbero essere tutti in minuscolo
- Gli underscore possono essere usati nel nome del pacchetto e del modulo solo se migliorano la leggibilità.
- Classi
- I nomi delle classi dovrebbero seguire la convenzione UpperCaseCamelCase
- Le classi built-in di Python, tuttavia, sono tipicamente parole in minuscolo
- Variabili di istanza, metodi e funzioni
- I nomi delle variabili di istanza dovrebbero essere tutti in minuscolo
- Usa l’underscore per aggiungere nuove parole alle istanze di variabili
- Le variabili di istanza non pubbliche dovrebbero iniziare con un singolo underscore
- Costanti
- I nomi delle costanti devono essere completamente in maiuscolo
- Usa l’underscore per aggiungere nuove parole alle costanti
|
Identificatore |
Convenzione |
|
Modulo |
minuscolo |
|
Classe |
CapWords |
|
Funzioni |
minuscolo |
|
Metodi |
minuscolo |
|
Variabili di tipo |
CapWords |
|
Costanti |
MAIUSCOLO |
|
Pacchetto |
minuscolo |
Conclusione
Apprendere a fondo le best practice di Python è essenziale per scrivere codice pulito, efficiente e mantenibile. Seguendo le linee guida su qualità del codice, logging, commenti e documentazione, e usando strumenti come gli ambienti virtuali, potrai fare in modo che i tuoi progetti siano più facili da gestire, collaborare e scalare.
Man mano che migliori le tue competenze in Python, valuta di esplorare risorse di apprendimento più approfondite per consolidare la tua comprensione di Python e della sua ampia gamma di applicazioni. Se cerchi una guida strutturata, dai un’occhiata a queste risorse:
- Come imparare Python: una guida per diventare esperto – Questa guida esperta ti aiuterà a orientarti nel percorso di apprendimento, offrendo consigli e tecniche per padroneggiare Python.
- Introduzione a Python per sviluppatori – Perfetto per gli sviluppatori che vogliono iniziare con Python, questo corso copre i concetti e le funzionalità principali del linguaggio in modo pratico e operativo.
- Introduzione alla data science in Python – Una volta che ti senti a tuo agio con Python, tuffati nella data science con questo corso per principianti. Copre le librerie e le tecniche essenziali per lavorare con i dati in Python.
Domande frequenti sulle best practice di Python
Perché è importante seguire le best practice di coding?
Per garantire leggibilità, qualità del codice e scalabilità durante le attività di sviluppo software.
Che cos’è un ambiente virtuale?
Un ambiente virtuale è uno strumento che separa le dipendenze di progetti diversi creando un ambiente isolato per ciascun progetto.
Che cos’è PEP 8?
È un documento che fornisce linee guida standard e best practice su come scrivere codice Python.
Che cos’è l’indentazione?
L’indentazione si riferisce agli spazi all’inizio di una riga di codice. Python usa l’indentazione per indicare un blocco di codice.
Che cos’è lo Zen di Python?
Lo Zen di Python è una raccolta di 19 "principi guida" per scrivere programmi che influenzano il design del linguaggio di programmazione Python.
Che cos’è una docstring?
Una docstring di Python è una stringa usata per documentare un modulo, una classe, una funzione o un metodo Python, così che i programmatori possano capire cosa fa senza dover leggere i dettagli dell’implementazione.
Quanti tipi di commenti sono comuni in Python?
Ci sono due tipi di commenti: commenti a blocco e commenti inline.
Sono una data analyst freelance e collaboro con aziende e organizzazioni di tutto il mondo in progetti di data science. Sono anche un'insegnante di data science con oltre 2 anni di esperienza. Scrivo regolarmente articoli su temi legati alla data science in inglese e spagnolo, alcuni dei quali sono stati pubblicati su siti affermati come DataCamp, Towards Data Science e Analytics Vidhya. Come data scientist con un background in scienze politiche e diritto, il mio obiettivo è lavorare all'intersezione tra politiche pubbliche, diritto e tecnologia, sfruttando la forza delle idee per promuovere soluzioni e narrazioni innovative che ci aiutino ad affrontare le sfide urgenti, in primis la crisi climatica. Mi considero autodidatta, una persona in continuo apprendimento e una convinta sostenitrice dell'approccio multidisciplinare. Non è mai troppo tardi per imparare cose nuove.


