Lezioni del modulo (1/4)
Type hints: annotare i tipi
I type hints (annotazioni di tipo) sono dichiarazioni opzionali che dicono "questa variabile/parametro è di tipo X". Python NON le verifica a runtime: servono a te, al tuo editor (autocomplete!) e a strumenti come mypy o pyright che fanno type-checking statico.
Annotare variabili
nome: str = "Ada"
anni: int = 36
attivo: bool = True
prezzi: list[float] = [1.2, 3.4]La sintassi è nome: tipo = valore. Senza valore è una dichiarazione pura:
risultato: int # nessuna assegnazione, solo "annuncio del tipo"Annotare funzioni
def saluta(nome: str, urlante: bool = False) -> str:
s = f"Ciao {nome}"
return s.upper() if urlante else s
def somma(numeri: list[int]) -> int:
return sum(numeri)Sintassi: param: tipo per ogni parametro, -> tipo per il return.
Una funzione che non ritorna nulla usa -> None.
Tipi generici built-in (Python 3.9+)
nomi: list[str] = ["a", "b"]
mappa: dict[str, int] = {"x": 1}
coppia: tuple[int, str] = (1, "ok")
unici: set[int] = {1, 2, 3}Optional e Union
Un valore che può essere None:
def trova_utente(id: int) -> str | None:
if id == 1:
return "Ada"
return NoneX | None è la sintassi moderna (Python 3.10+). Equivalente: Optional[X] da typing.
Per unioni di più tipi: int | str | float.
typing: strumenti utili
from typing import Any, Callable
def applica(f: Callable[[int], int], x: int) -> int:
return f(x)
valore: Any = "qualunque cosa" # disabilita il checkAny= "non controllare" (usalo poco).Callable[[arg1, arg2], return]= una funzione che prende quei parametri e ritorna quel tipo.
mypy: il type-checker
Installi mypy, lanci mypy file.py e ti dice se i tipi tornano:
$ mypy script.py
script.py:5: error: Argument 1 to "somma" has incompatible type "str"; expected "int"Verificare i tipi con mypy
Le type hint di Python non vengono verificate a runtime dall'interprete: sono ignorate all'esecuzione. Per convalidare la correttezza formale del codice rispetto ai tipi occorre usare uno strumento esterno di analisi statica come mypy, lanciando il comando mypy script.py nel terminale.
Prova tu
Definisci una funzione `double(numbers: list[int]) -> list[int]` che ritorna una lista con ogni elemento moltiplicato per 2. Chiamala con [1, 2, 3] e assegna a `r`. Valuta `r`.
Mostra suggerimento
Usa una list comprehension o un for.
Soluzione disponibile dopo 3 tentativi
Esercizio di ripasso
Definisci `first_or_none(items: list[int]) -> int | None` che ritorna il primo elemento se la lista non è vuota, altrimenti None. Assegna `a = first_or_none([10, 20])` e `b = first_or_none([])`. Valuta `(a, b)`.
Mostra suggerimento
if items è vero quando la lista NON è vuota.
Soluzione disponibile dopo 3 tentativi
Sfida aggiuntiva
Scrivi una funzione `double_value(n: int) -> int` che prenda un intero, lo moltiplichi per 2 e lo restituisca. Assicurati di dichiarare le type hint per parametro e valore di ritorno. Valuta infine la chiamata `double_value(5)`.
Mostra suggerimento
Usa n: int come parametro e -> int dopo la firma della funzione.
Soluzione disponibile dopo 3 tentativi