Saltar al contenido principal
eLearner.app
Módulo 9 · Lección 1 de 433/36 en el curso~12 min
Lecciones del módulo (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

Ejercicio#python.m9.l1.e1
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

Usa una list comprehension o un for.

Solución disponible después de 3 intentos

Esercizio di ripasso

Ejercicio#python.m9.l1.e2
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

if items è vero quando la lista NON è vuota.

Solución disponible después de 3 intentos

Sfida aggiuntiva

Ejercicio#python.m9.l1.e3
Intentos: 0Cargando...

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

Cargando editor...
Mostrar pista

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

Solución disponible después de 3 intentos