Best practice in Python
Questo articolo spiega le best practice in Python.
Spiegheremo le best practice di Python con esempi di codice reali, introducendo modi per scrivere codice leggibile e manutenibile.
YouTube Video
Best practice in Python
Mettere la leggibilità come massima priorità
Per prima cosa, vediamo cosa significa ‘mettere la leggibilità come massima priorità’.
Python è un linguaggio che valorizza la 'leggibilità'. Per prima cosa, dai priorità a scrivere codice la cui intenzione sia chiara a colpo d’occhio.
1# Bad example: unclear variable names
2a = 10
3b = 5
4c = a * bIn questo codice, i nomi delle variabili non trasmettono il loro significato, quindi ci vuole tempo agli altri per capirlo in seguito.
1# Good example: descriptive variable names
2price = 10
3quantity = 5
4total_cost = price * quantityRendendo i nomi delle variabili specifici, il tuo codice stesso funge da documentazione.
Scrivi codice esplicito
Ora vediamo cosa significa ‘scrivere codice esplicito’.
In Python, 'l’intenzione esplicita' è preferita rispetto al 'comportamento implicito'.
1# Bad example: implicit truthy check
2if data:
3 process(data)In questo codice, non è chiaro cosa ci si aspetta da data, creando terreno fertile per i bug.
1# Good example: explicit condition
2if len(data) > 0:
3 process(data)Rendendo le condizioni esplicite, l’intenzione del codice corrisponde alla sua specifica.
Mantieni le funzioni piccole e concentrate su una sola responsabilità
Ora vediamo cosa significa ‘mantenere le funzioni piccole e concentrate su una sola responsabilità’.
Quando una funzione fa troppe cose, testarla e mantenerla diventa difficile.
1# Bad example: doing too many things
2def handle_user(user):
3 save_to_database(user)
4 send_email(user)
5 write_log(user)In questo codice, i processi diventano troppo interconnessi, rendendo difficile il riutilizzo e la modifica.
1# Good example: single responsibility
2def save_user(user):
3 save_to_database(user)
4
5def notify_user(user):
6 send_email(user)
7
8def log_user(user):
9 write_log(user)Dividendo le funzioni, i loro ruoli diventano chiari e i test diventano più semplici.
Utilizza attivamente gli indizi di tipo (type hints)
Ora vediamo cosa significa 'utilizzare attivamente gli indizi di tipo (type hints)'.
Gli indizi di tipo fungono da documentazione e sono un potente strumento per prevenire bug.
1# Bad example: Without type hints
2def add(a, b):
3 return a + bIn questo codice, i tipi degli argomenti e dei valori di ritorno non sono chiari, aumentando la probabilità di errori.
1# Good example: With type hints
2def add(a: int, b: int) -> int:
3 return a + bCon gli indizi di tipo, l'autocompletamento dell'IDE, l'analisi statica e la leggibilità migliorano notevolmente.
Indica esplicitamente la possibilità di restituire None
Ora vediamo cosa significa 'indicare esplicitamente la possibilità di restituire None'.
Le funzioni che possono restituire None sono spesso trascurate da chi le utilizza.
1# Bad example: Ambiguous return value
2def find_user(user_id):
3 if user_id == 1:
4 return {"id": 1, "name": "Alice"}
5 return NoneIn questo codice, non è chiaro se ci sarà un valore di ritorno.
1# Good example: explicit return type
2from typing import Optional, Dict, Any
3
4def find_user(user_id: int) -> Optional[Dict[str, Any]]:
5 if user_id == 1:
6 return {"id": 1, "name": "Alice"}
7 return NoneUtilizzando Optional, puoi comunicare la possibilità di restituire None come tipo.
Non catturare le eccezioni in modo troppo generico
Ora vediamo cosa significa 'non catturare le eccezioni in modo troppo generico'.
La gestione delle eccezioni dovrebbe fundamentalmente gestire solo ciò che è necessario.
1# Bad example: catching all exceptions
2try:
3 result = int(value)
4except Exception:
5 result = 0Questo codice può nascondere bug che avrebbero dovuto essere notati.
1# Good example: catch specific exception
2try:
3 result = int(value)
4except ValueError:
5 result = 0Restringendo le eccezioni, non trascurerai problemi inaspettati.
Gestisci le risorse in modo sicuro con l’istruzione with
Ora vediamo cosa significa ‘gestire le risorse in modo sicuro con l’istruzione with’.
Le risorse come file e blocchi devono sempre essere rilasciate in modo affidabile.
1# Bad example: manual close
2file = open("data.txt")
3content = file.read()
4file.close()In questo codice, se si verifica un’eccezione, close() potrebbe non essere chiamato.
1# Good example: using context manager
2with open("data.txt") as file:
3 content = file.read()Utilizzando un’istruzione with, la pulizia viene eseguita in sicurezza anche in caso di eccezioni.
Usa le list comprehension in modo appropriato
Ora vediamo cosa significa ‘usare le list comprehension in modo appropriato’.
Processi di trasformazione semplici possono essere scritti in modo conciso usando le list comprehension.
1# Bad example: Verbose loop
2squares = []
3for i in range(10):
4 squares.append(i * i)In questo codice, il processo principale è difficile da individuare.
1# Good example: Clear list comprehension
2squares = [i * i for i in range(10)]Usando le list comprehension in modo appropriato, la leggibilità del codice migliora.
Evita i numeri magici
Ora vediamo cosa significa ‘evitare i numeri magici’.
Scrivere numeri e stringhe direttamente rende il loro significato poco chiaro.
1# Bad example: magic number
2if status == 404:
3 handle_not_found()In questo codice, si presume che tu conosca il significato di 404.
1# Good example: named constant
2NOT_FOUND = 404
3
4if status == NOT_FOUND:
5 handle_not_found()Dare nomi rende chiare le intenzioni.
Scrivi codice che sia manutenibile, non solo codice che 'funziona'
Infine, vediamo cosa significa ‘scrivere codice che sia manutenibile, non solo codice che funziona’.
Il punto importante è se tu in futuro o altre persone potranno capirlo.
1# Bad example: Hard to maintain
2def f(x):
3 return x * 1.08 + 100In questo codice, la specifica non può essere compresa dal codice stesso.
1# Good example: Easy to maintain
2TAX_RATE = 1.08
3BASE_FEE = 100
4
5def calculate_total(price: float) -> float:
6 return price * TAX_RATE + BASE_FEERiflettendo il significato nei nomi, il codice stesso diventa la specifica.
Riepilogo
Le best practice di Python si riducono a scrivere codice facile da capire, piuttosto che codice ingegnoso. Costruire piccole abitudini porta a scrivere codice con meno bug che può essere usato a lungo.
Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.