2.17. Annotazioni di tipo

Python consente di annotare i parametri e i valori di ritorno delle funzioni con informazioni di tipo. Le annotazioni vengono ignorate in fase di esecuzione – nulla le controlla, nulla converte in base a esse – ma fungono da documentazione per chi legge e per l’IDE.

2.17.1. Sintassi delle annotazioni

L’annotazione di un parametro va dopo i due punti. Il tipo di ritorno va dopo -> e prima dei due punti del corpo:

def greet(name: str) -> None:
    print("hello,", name)

def add(a: int, b: int) -> int:
    return a + b

def average(values: list) -> float:
    return sum(values) / len(values)

Le annotazioni descrivono cosa dovrebbe essere passato in ingresso e cosa verrà restituito. Chiamare add("hi", "there") non solleva alcun errore: Python esegue comunque il corpo. Le annotazioni sono un contratto, non un controllo.

Un parametro può avere sia un valore predefinito sia un’annotazione:

def greet(name: str, greeting: str = "hello") -> None:
    print(greeting, name)

CPython dispone di una notazione più ricca (Optional, Union, generici) tramite il modulo typing, ma questi sono pesanti su MicroPython e raramente necessari per il comune codice della camera.

2.17.2. MicroPython in fase di esecuzione

MicroPython analizza le annotazioni e poi le ignora. Sulla camera non c’è alcun modulo typing da importare; tentare di usare Optional[int] o list[int] causerà un fallimento dell’import oppure si comporterà silenziosamente come un semplice accesso ad attributo, a seconda della build del firmware.

Limitati ai nomi di tipo semplici (int, float, str, bool, bytes, list, tuple, dict) nelle annotazioni. Non costano nulla in fase di esecuzione e trasmettono chiaramente l’intento.

2.17.3. Come le usa l’IDE

L’IDE legge le annotazioni per alimentare tooltip, completamento automatico e suggerimenti inline. Una funzione annotata con -> int mostra int come tipo di ritorno quando il cursore passa sulla chiamata. Un parametro annotato con : str completa automaticamente i metodi delle stringhe sull’argomento all’interno del corpo della funzione.

Questo è il vantaggio pratico di scrivere annotazioni su un runtime che le ignora: un supporto migliore da parte dell’editor senza alcun costo quando lo script viene eseguito sulla camera.

2.17.4. Annotazioni di variabili

Le annotazioni sulle semplici assegnazioni funzionano allo stesso modo:

threshold: float = 0.5
name: str = "OpenMV"

Anche queste vengono ignorate in fase di esecuzione. Il loro uso principale è rendere evidente il tipo previsto quando il lato destro non lo rende ovvio, in genere quando il valore iniziale è un segnaposto che verrà sostituito in seguito.