
Le annotazioni nelle funzioni in Python
Le annotazioni nelle funzioni Python sono metadati aggiuntivi che puoi indicare sui parametri o sul valore di ritorno di una funzione.
A cosa servono? Sono uno strumento utile per rendere il codice più leggibile e ti permettono di interrogare la funzione per ottenere informazioni sui parametri o sul valore di ritorno. Sono facoltativi e non influenzano l'esecuzione del programma. Le annotazioni sono particolarmente utili in ambienti di sviluppo e durante la fase di debugging, poiché aiutano gli sviluppatori a capire cosa dovrebbe essere passato a una funzione e cosa essa restituirà.
Sono state introdotte con la versione 3.0 del linguaggio Python.
Ecco come funzionano:
- Annotazioni per i parametri
Puoi annotare il tipo di ogni parametro di una funzione ponendo un colon (:) dopo il nome del parametro, seguito dal tipo di dato. L'eventuale valore di default va messo dopo. Ad esempio funzione(numero:int=5). - Annotazioni per il valore di ritorno
Puoi anche annotare il tipo del valore di ritorno di una funzione. Questo si fa ponendo una freccia (->) dopo l'elenco dei parametri, seguita dal tipo di ritorno. Ad esempio funzione(numero) -> 'commento'
Ricorda che puoi inserire le annotazioni solo nelle funzioni ordinarie.
Non puoi, invece, inserirle nelle funzioni anonime.
Le annotazioni sono comunque descrizioni facoltative e non forzano il tipo di dati effettivo. In altre parole, anche se annoti un parametro come un certo tipo (es. "int"), questo non impedisce che venga passato un valore di tipo diverso (es. "str"). Per fare controlli di tipo effettivi a runtime, dovresti usare moduli esterni come mypy o implementare controlli manuali nel tuo codice.
Un esempio pratico
Ecco un semplice esempio di una funzione con annotazioni:
def saluta(nome: str, anno:int=2000) -> str:
return f"Hello, {nome}!"
In questo esempio, il parametro "nome: str" indica che dovrebbe essere una stringa.
L'annotazione "-> str", invece, indica che la funzione restituirà una stringa.
Le annotazioni vengono memorizzate nell'attributo __annotations__ dell'oggetto funzione.
print(saluta.__annotations__)
{'nome': <class 'str'>, 'anno': <class 'int'>, 'return': <class 'str'>}
Come puoi vedere, a differenza della docstring le annotazioni ti permettono di aggiungere delle informazioni più specifiche sui parametri e sul valore di ritorno.
Ovviamente, i tipi indicati nelle annotazioni non hanno alcun impatto sull'esecuzione del programma perché il linguaggio Python è a tipizzazione dinamica.
Ad esempio, puoi chiamare la funzione passandogli un numero (5) anziché una stringa e funzionerà lo stesso.
print(saluta(5))
Hello 5!
Per fare in modo che i tipi annotati siano anche vincolanti dovresti eseguire il programma tramite mypy
mypy nomeProgramma.py
Si tratta di un verificatore esterno di tipi statici che analizza i tipi annotati nelle funzioni e individua le eventuali incongruenze nel programma. Può essere lanciato solo dalla riga di comando e implica un maggiore consumo delle risorse computazionali.
Puoi usare le annotazioni anche per inserire delle descrizioni sotto forma di stringhe.
def velocita(s: 'spazio in metri', t:'tempo in secondi'=1) -> 'velocità di un corpo':
return s/t
Inoltre, puoi anche fare un'introspezione e interrogare le annotazioni per singoli parametri.
print(velocita.__annotations__['t'])
tempo in secondi
In questo modo puoi utilizzare queste informazioni tramite degli IDE per spiegare in cosa consiste ogni singolo parametro della funzione.
In conclusione, le annotazioni sono un modo potente per rendere il tuo codice più chiaro e mantenibile, anche se non modificano il comportamento del programma.