Storia della questione:
La tipizzazione dinamica è caratteristica di Python fin dalle prime versioni. Ciò significa che le variabili non sono legate a un tipo di dato specifico in anticipo, a differenza di linguaggi come Java o C++. Il tipo viene determinato durante l'esecuzione.
Problema:
La principale difficoltà è la perdita di controllo esplicito sui tipi. Ciò complica l'individuazione degli errori durante la scrittura del codice, con il rischio di bug logici durante il runtime, soprattutto con il codice su grande scala.
Soluzione:
Python affronta questo problema tramite il duck typing (se un oggetto si comporta come una papera, allora è una papera), nonché con l'uso di annotazioni di tipo (type hints), anche se queste annotazioni non sono obbligatorie e non vengono verificate durante l'esecuzione, solo da strumenti esterni.
Esempio di codice:
x = 42 # int x = "foo" # ora è una stringa def process(val): return val + val print(process(5)) # 10 print(process("ha")) # haha
Caratteristiche chiave:
È possibile utilizzare una variabile prima come lista e poi come numero nello stesso blocco di codice, e questo porterà a un errore di sintassi?
Sì — non ci sarà un errore di sintassi. L'errore si verificherà solo nel tentativo di eseguire un'operazione non valida con il nuovo tipo.
x = [1, 2, 3] x = 5 # print(x[0]) # Errore si verificherà solo con questa chiamata
Il type hint in Python garantisce che la variabile avrà sempre il tipo specificato durante l'esecuzione?
No — il type hint è solo un suggerimento, l'interprete non lo verifica. I tipi possono essere controllati solo da linters e mypy.
def foo(x: int) -> int: return x + 1 foo("string") # non si verificherà alcun errore fino alla chiamata
Il tipo di una funzione è anch'esso dinamico? È possibile modificare la firma di una funzione durante l'esecuzione?
Una funzione è un oggetto di primo livello. Il suo tipo può essere ridefinito, ma la firma non può essere cambiata (è possibile sostituire la funzione con una nuova).
def f(): return 5 f = lambda: "abc" print(f()) # 'abc'
Caso negativo
In un progetto, il tipo dei parametri di ingresso di una funzione non era verificato, il che portava a ricevere dati da form utente come stringhe e lavorare con essi come se fossero numeri. Si verificavano errori imprevedibili in produzione.
Vantaggi:
Prototipazione rapida, funzioni brevi, poco boilerplate.
Svantaggi:
Difficile da fare debug, gli errori si manifestano nei luoghi più imprevisti e solo con dati specifici.
Caso positivo
Utilizzando type hints e validazione statica dei tipi tramite mypy, i problemi venivano rilevati durante il CI/CD prima di andare in produzione.
Vantaggi:
Rilevamento precoce di potenziali problemi, facile manutenzione del codice.
Svantaggi:
Richiesta di tempo per controlli aggiuntivi, talvolta viene aggiunto un po’ di codice superfluo.