Storia della questione: I type hints sono apparsi in Python 3.5 (PEP 484) per supportare l'analisi statica del codice, il completamento automatico, il refactoring e la documentazione automatica. In precedenza, Python si era sempre ben comportato senza tipizzazione rigida, ma con l'aumento dei progetti e dei team, sono diventati necessari per migliorare la qualità del codice.
Problema: Le annotazioni dei tipi sono solo suggerimenti per gli sviluppatori e per strumenti esterni (mypy, Pyright, ecc.), l'interprete stesso le ignora durante l'esecuzione. Gli errori si verificano spesso se:
Soluzione: Utilizzare le annotazioni dei tipi per le funzioni e le variabili per migliorare la leggibilità, l'analisi del codice da parte dei linter e degli IDE. Non bisogna fare affidamento esclusivo sulle annotazioni: è necessaria una verifica statica dei tipi. Esempio:
def greeting(name: str) -> str: return f"Hello, {name}" def sum_nums(nums: list[int]) -> int: return sum(nums)
Esempi più complessi utilizzano il modulo typing:
from typing import List, Dict, Optional def process(data: List[Dict[str, Optional[int]]]) -> None: ...
Caratteristiche principali:
L'interprete Python gestisce i tipi dalle annotazioni durante l'esecuzione?
No. Le annotazioni sono accessibili tramite __annotations__, ma non controllano il comportamento durante l'esecuzione.
È possibile utilizzare variabili senza annotazioni in funzioni annotate?
Sì. Le annotazioni non sono obbligatorie, ma la loro assenza può confondere.
È possibile ridefinire il tipo di una variabile dopo l'annotazione?
Sì, ma questo viola il principio dell'analisi statica e ostacola i linter. Meglio evitare:
x: int = 5 x = 'stringa' # Il linter darà un avviso, ma il codice verrà eseguito.
Caso negativo: Si annota una funzione, ma il tipo restituito è diverso da quello in annotazione a causa della modifica della logica della funzione. Punti positivi:
Caso positivo: Tutte le funzioni e i dati sono annotati, il progetto viene controllato da mypy durante CI/CD. Punti positivi: