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.