Leçons du module (1/4)
Type hints : annoter les types
Les indications de type ou type hints (annotations de type) sont des déclarations facultatives indiquant que "cette variable/paramètre a le type X". Python ne les vérifie PAS à l'exécution : elles sont pour vous, votre éditeur (l'autocomplétion !) et des outils comme mypy ou pyright qui effectuent un contrôle statique des types.
Annoter des variables
nome: str = "Ada"
anni: int = 36
attivo: bool = True
prezzi: list[float] = [1.2, 3.4]La syntaxe est nom: type = valeur. Sans valeur, il s'agit d'une simple déclaration :
risultato: int # nessuna assegnazione, solo "annuncio del tipo"Annoter des fonctions
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)Syntaxe : param: type pour chaque paramètre, -> type pour le retour. Une fonction qui ne renvoie rien utilise -> None.
Types génériques intégrés (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 et Union
Une valeur qui peut être None :
def trova_utente(id: int) -> str | None:
if id == 1:
return "Ada"
return NoneX | None est la syntaxe moderne (Python 3.10+). Équivalent : Optional[X] de typing. Pour les unions de plusieurs types : int | str | float.
typing : outils utiles
from typing import Any, Callable
def applica(f: Callable[[int], int], x: int) -> int:
return f(x)
valore: Any = "qualunque cosa" # disabilita il checkAny= "ne pas contrôler" (à utiliser avec modération).Callable[[arg1, arg2], retour]= une fonction qui prend ces paramètres et renvoie ce type.
mypy : le contrôleur de types
Vous installez mypy, lancez mypy fichier.py, et il vous dit si les types correspondent :
$ mypy script.py
script.py:5: error: Argument 1 to "somma" has incompatible type "str"; expected "int"Contrôle des types avec mypy
Les indications de type de Python ne sont pas appliquées à l'exécution par l'interpréteur ; elles sont ignorées pendant l'exécution. Pour valider l'exactitude des types, vous devez exécuter un outil externe d'analyse statique comme mypy en lançant la commande mypy script.py dans votre terminal.
À vous de jouer
Définissez une fonction `double(numbers: list[int]) -> list[int]` qui renvoie une liste avec chaque élément multiplié par 2. Appelez-la avec [1, 2, 3] et assignez-la à `r`. Évaluez `r`.
Afficher l'indice
Utilisez une compréhension de liste ou une boucle for.
Solution disponible après 3 tentatives
Exercice de révision
Définissez `first_or_none(items: list[int]) -> int | None` qui renvoie le premier élément si la liste n'est pas vide, sinon None. Assignez `a = first_or_none([10, 20])` et `b = first_or_none([])`. Évaluez `(a, b)`.
Afficher l'indice
`if items` est vrai lorsque la liste n'est pas vide.
Solution disponible après 3 tentatives
Défi supplémentaire
Écrivez une fonction `double_value(n: int) -> int` qui prend un entier, le multiplie par 2 et renvoie le résultat. Veillez à spécifier des indications de type pour le paramètre et la valeur de retour. Enfin, évaluez `double_value(5)`.
Afficher l'indice
Utilisez n: int comme paramètre et -> int après la signature de la fonction.
Solution disponible après 3 tentatives