Passer au contenu principal
eLearner.app
Module 9 · Leçon 1 sur 433/36 dans le cours~12 min
Leçons du module (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

Exercice#python.m9.l1.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

Usa una list comprehension o un for.

Solution disponible après 3 tentatives

Esercizio di ripasso

Exercice#python.m9.l1.e2
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

if items è vero quando la lista NON è vuota.

Solution disponible après 3 tentatives

Sfida aggiuntiva

Exercice#python.m9.l1.e3
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives