Vai al contenuto
eLearner.app
Modulo 9 · Lezione 1 di 433/36 nel corso~12 min
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

Python
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:

Python
risultato: int  # nessuna assegnazione, solo "annuncio del tipo"

Annotare funzioni

Python
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+)

Python
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:

Python
def trova_utente(id: int) -> str | None:
    if id == 1:
        return "Ada"
    return None

X | None è la sintassi moderna (Python 3.10+). Equivalente: Optional[X] da typing. Per unioni di più tipi: int | str | float.

typing: strumenti utili

Python
from typing import Any, Callable

def applica(f: Callable[[int], int], x: int) -> int:
    return f(x)

valore: Any = "qualunque cosa"  # disabilita il check
  • Any = "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:

Bash
$ 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

Esercizio#python.m9.l1.e1
Tentativi: 0Caricamento…

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`.

Caricamento editor…
Mostra suggerimento

Usa una list comprehension o un for.

Soluzione disponibile dopo 3 tentativi

Esercizio di ripasso

Esercizio#python.m9.l1.e2
Tentativi: 0Caricamento…

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)`.

Caricamento editor…
Mostra suggerimento

if items è vero quando la lista NON è vuota.

Soluzione disponibile dopo 3 tentativi

Sfida aggiuntiva

Esercizio#python.m9.l1.e3
Tentativi: 0Caricamento…

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)`.

Caricamento editor…
Mostra suggerimento

Usa n: int come parametro e -> int dopo la firma della funzione.

Soluzione disponibile dopo 3 tentativi