Annotazioni di tipo in Python

Python è un linguaggio molto facile da apprendere anche per i non informatici, grazie alla pulizia della sua sintassi, alla non tipizzazione dei dati e all’eliminazione di molti elementi ostici come punti e virgola, tipi di ritorno espliciti, ecc. In realtà, quando facciamo scripting rapido, queste caratteristiche sono molto desiderabili, ma se ci imbarchiamo in codice più complesso e strutturato, avere degli ausili per tenere traccia dei tipi di dato nei parametri potrebbe essere vincente. Per questi motivi, dalle versioni 3.5 e 3.6 sono state introdotte delle annotazioni di tipo (type hints), non obbligatorie, che non vengono utilizzate in fase di parsing/compilazione ma sono preziose per una lettura facilitata del codice. Vediamone alcune utili per il livello scolastico.


Ci sono anche alcuni plugin come Pylance di Visual Studio Code che leggono le annotazioni e danno suggerimenti non bloccanti utili allo sviluppatore. Pycharm, da IDE strutturato, è già compatibile.

Tipi di variabili

Il tipo di variabile sappiamo non essere obbligatorio, ma possiamo annotare il contenuto che verrà posto in fase di inizializzazione contestuale o semplicemente successiva. Attenzione alla seconda dicitura: se provo a stampare pluto mi darà comunque errore di variabile non inizializzata; l’annotazione non dà nessun valore predefinito.

pippo = 10   #classico
pippo: int = 10   #con annotazione

pluto: int   #errore

Ovviamente si possono usare i tipi floot, str, bool, meno usati bytes e Any.

Il tipo Any è particolarmente utile quando non sappiamo quale tipo di dato riceveremo, ma andrebbe usato con parsimonia perché vanifica i vantaggi delle annotazioni.

from typing import Any

dato_generico: Any = "potrebbe essere qualsiasi cosa"
dato_generico = 42  # nessun problema

Liste e dizionari

Anche su dati strutturati le annotazioni ci aiutano, almeno in fase di dichiarazione.

nomi: list[str] = ["pippo", "pluto"]    # lista di stringhe
eta: dict[str, int] = {"mario": 30}     # dizionario con chiavi string e valori int
numeri: list[int] = [1, 2, 3, 4, 5]     # lista di interi

Funzioni

Sicuramente le annotazioni più interessanti sono quelle del tipo di ritorno nelle funzioni. Python, sappiamo, può restituire uno o più valori semplicemente ponendo la parola return seguita da una o più variabili, di cui viene passata la copia. Nella definizione della funzione si riconosce solo la parola chiave def e i parametri; non è infatti necessario specificare di quale tipo (int, string, char, ecc.). Nello scripting veloce è comodo e desiderabile tale semplificazione, ma in un codice con classi e numerosi metodi/funzioni può risultare utile specificarlo.

def potenza(base: int, esponente: int = 2) -> int:
    return base ** esponente

def saluta(nome: str) -> str:
    return f"Ciao, {nome}!"

#funzioni senza ritorno
def stampa_messaggio(testo: str) -> None:
    print(testo)

Attenzione: Python può restituire anche più di un valore per funzione, ma non c’è un’annotazione diretta, quindi si usa il tipo tuple.

def coordinate() -> tuple[int, int]:
    return 10, 20

def dati_studente() -> tuple[str, int, float]:
    return "Mario", 18, 7.5  # nome, età, media

Interessante è la possibilità di un ritorno di tipo alternativo, magari condizionato da un’istruzione if. Occhio, potrebbe essere una pratica pericolosa in molti casi, da usare con cautela

def valore(x: str) -> int | None:
    if x.isdigit():
        return int(x)
    return None

Ultima modifica 9 Novembre 2025