From a694be81ae2f2d4b6657fd33b62bc631acbc3f04 Mon Sep 17 00:00:00 2001 From: Sam Courtemanche Date: Fri, 2 Jul 2021 16:13:52 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Add=20French=20translation=20for?= =?UTF-8?q?=20Python=20Types=20Intro=20(#3185)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fr/docs/python-types.md | 314 +++++++++++++++++++++++++++++++++++ docs/fr/mkdocs.yml | 1 + 2 files changed, 315 insertions(+) create mode 100644 docs/fr/docs/python-types.md diff --git a/docs/fr/docs/python-types.md b/docs/fr/docs/python-types.md new file mode 100644 index 000000000..4008ed96f --- /dev/null +++ b/docs/fr/docs/python-types.md @@ -0,0 +1,314 @@ +# Introduction aux Types Python + +Python supporte des annotations de type (ou *type hints*) optionnelles. + +Ces annotations de type constituent une syntaxe spéciale qui permet de déclarer le type d'une variable. + +En déclarant les types de vos variables, cela permet aux différents outils comme les éditeurs de texte d'offrir un meilleur support. + +Ce chapitre n'est qu'un **tutoriel rapide / rappel** sur les annotations de type Python. +Seulement le minimum nécessaire pour les utiliser avec **FastAPI** sera couvert... ce qui est en réalité très peu. + +**FastAPI** est totalement basé sur ces annotations de type, qui lui donnent de nombreux avantages. + +Mais même si vous n'utilisez pas ou n'utiliserez jamais **FastAPI**, vous pourriez bénéficier d'apprendre quelques choses sur ces dernières. + +!!! note + Si vous êtes un expert Python, et que vous savez déjà **tout** sur les annotations de type, passez au chapitre suivant. + +## Motivations + +Prenons un exemple simple : + +```Python +{!../../../docs_src/python_types/tutorial001.py!} +``` + +Exécuter ce programe affiche : + +``` +John Doe +``` + +La fonction : + +* Prend un `first_name` et un `last_name`. +* Convertit la première lettre de chaque paramètre en majuscules grâce à `title()`. +* Concatène les résultats avec un espace entre les deux. + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial001.py!} +``` + +### Limitations + +C'est un programme très simple. + +Mais maintenant imaginez que vous l'écriviez de zéro. + +À un certain point vous auriez commencé la définition de la fonction, vous aviez les paramètres prêts. + +Mais vous aviez besoin de "cette méthode qui convertit la première lettre en majuscule". + +Était-ce `upper` ? `uppercase` ? `first_uppercase` ? `capitalize` ? + +Vous essayez donc d'utiliser le vieil ami du programmeur, l'auto-complétion de l'éditeur. + +Vous écrivez le premier paramètre, `first_name`, puis un point (`.`) et appuyez sur `Ctrl+Espace` pour déclencher l'auto-complétion. + +Mais malheureusement, rien d'utile n'en résulte : + + + +### Ajouter des types + +Modifions une seule ligne de la version précédente. + +Nous allons changer seulement cet extrait, les paramètres de la fonction, de : + + +```Python + first_name, last_name +``` + +à : + +```Python + first_name: str, last_name: str +``` + +C'est tout. + +Ce sont des annotations de types : + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial002.py!} +``` + +À ne pas confondre avec la déclaration de valeurs par défaut comme ici : + +```Python + first_name="john", last_name="doe" +``` + +C'est une chose différente. + +On utilise un deux-points (`:`), et pas un égal (`=`). + +Et ajouter des annotations de types ne crée normalement pas de différence avec le comportement qui aurait eu lieu si elles n'étaient pas là. + +Maintenant, imaginez que vous êtes en train de créer cette fonction, mais avec des annotations de type cette fois. + +Au même moment que durant l'exemple précédent, vous essayez de déclencher l'auto-complétion et vous voyez : + + + +Vous pouvez donc dérouler les options jusqu'à trouver la méthode à laquelle vous pensiez. + + + +## Plus de motivations + +Cette fonction possède déjà des annotations de type : + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial003.py!} +``` + +Comme l'éditeur connaît le type des variables, vous n'avez pas seulement l'auto-complétion, mais aussi de la détection d'erreurs : + + + +Maintenant que vous avez connaissance du problème, convertissez `age` en chaine de caractères grâce à `str(age)` : + +```Python hl_lines="2" +{!../../../docs_src/python_types/tutorial004.py!} +``` + +## Déclarer des types + +Vous venez de voir là où les types sont généralement déclarés : dans les paramètres de fonctions. + +C'est aussi ici que vous les utiliseriez avec **FastAPI**. + +### Types simples + +Vous pouvez déclarer tous les types de Python, pas seulement `str`. + +Comme par exemple : + +* `int` +* `float` +* `bool` +* `bytes` + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial005.py!} +``` + +### Types génériques avec des paramètres de types + +Il existe certaines structures de données qui contiennent d'autres valeurs, comme `dict`, `list`, `set` et `tuple`. Et les valeurs internes peuvent elles aussi avoir leurs propres types. + +Pour déclarer ces types et les types internes, on utilise le module standard de Python `typing`. + +Il existe spécialement pour supporter ces annotations de types. + +#### `List` + +Par exemple, définissons une variable comme `list` de `str`. + +Importez `List` (avec un `L` majuscule) depuis `typing`. + +```Python hl_lines="1" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +Déclarez la variable, en utilisant la syntaxe des deux-points (`:`). + +Et comme type, mettez `List`. + +Les listes étant un type contenant des types internes, mettez ces derniers entre crochets (`[`, `]`) : + +```Python hl_lines="4" +{!../../../docs_src/python_types/tutorial006.py!} +``` + +!!! tip "Astuce" + Ces types internes entre crochets sont appelés des "paramètres de type". + + Ici, `str` est un paramètre de type passé à `List`. + +Ce qui signifie : "la variable `items` est une `list`, et chacun de ses éléments a pour type `str`. + +En faisant cela, votre éditeur pourra vous aider, même pendant que vous traitez des éléments de la liste. + + + +Sans types, c'est presque impossible à réaliser. + +Vous remarquerez que la variable `item` n'est qu'un des éléments de la list `items`. + +Et pourtant, l'éditeur sait qu'elle est de type `str` et pourra donc vous aider à l'utiliser. + +#### `Tuple` et `Set` + +C'est le même fonctionnement pour déclarer un `tuple` ou un `set` : + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial007.py!} +``` + +Dans cet exemple : + +* La variable `items_t` est un `tuple` avec 3 éléments, un `int`, un deuxième `int`, et un `str`. +* La variable `items_s` est un `set`, et chacun de ses éléments est de type `bytes`. + +#### `Dict` + +Pour définir un `dict`, il faut lui passer 2 paramètres, séparés par une virgule (`,`). + +Le premier paramètre de type est pour les clés et le second pour les valeurs du dictionnaire (`dict`). + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial008.py!} +``` + +Dans cet exemple : + +* La variable `prices` est de type `dict` : + * Les clés de ce dictionnaire sont de type `str`. + * Les valeurs de ce dictionnaire sont de type `float`. + +#### `Optional` + +Vous pouvez aussi utiliser `Optional` pour déclarer qu'une variable a un type, comme `str` mais qu'il est "optionnel" signifiant qu'il pourrait aussi être `None`. + +```Python hl_lines="1 4" +{!../../../docs_src/python_types/tutorial009.py!} +``` + +Utiliser `Optional[str]` plutôt que `str` permettra à l'éditeur de vous aider à détecter les erreurs où vous supposeriez qu'une valeur est toujours de type `str`, alors qu'elle pourrait aussi être `None`. + +#### Types génériques + +Les types qui peuvent contenir des paramètres de types entre crochets, comme : + +* `List` +* `Tuple` +* `Set` +* `Dict` +* `Optional` +* ...et d'autres. + +sont appelés des **types génériques** ou **Generics**. + +### Classes en tant que types + +Vous pouvez aussi déclarer une classe comme type d'une variable. + +Disons que vous avez une classe `Person`, avec une variable `name` : + +```Python hl_lines="1-3" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Vous pouvez ensuite déclarer une variable de type `Person` : + +```Python hl_lines="6" +{!../../../docs_src/python_types/tutorial010.py!} +``` + +Et vous aurez accès, encore une fois, au support complet offert par l'éditeur : + + + +## Les modèles Pydantic + +Pydantic est une bibliothèque Python pour effectuer de la validation de données. + +Vous déclarez la forme de la donnée avec des classes et des attributs. + +Chaque attribut possède un type. + +Puis vous créez une instance de cette classe avec certaines valeurs et **Pydantic** validera les valeurs, les convertira dans le type adéquat (si c'est nécessaire et possible) et vous donnera un objet avec toute la donnée. + +Ainsi, votre éditeur vous offrira un support adapté pour l'objet résultant. + +Extrait de la documentation officielle de **Pydantic** : + +```Python +{!../../../docs_src/python_types/tutorial011.py!} +``` + +!!! info + Pour en savoir plus à propos de Pydantic, allez jeter un coup d'oeil à sa documentation. + +**FastAPI** est basé entièrement sur **Pydantic**. + +Vous verrez bien plus d'exemples de son utilisation dans [Tutoriel - Guide utilisateur](tutorial/index.md){.internal-link target=_blank}. + +## Les annotations de type dans **FastAPI** + +**FastAPI** utilise ces annotations pour faire différentes choses. + +Avec **FastAPI**, vous déclarez des paramètres grâce aux annotations de types et vous obtenez : + +* **du support de l'éditeur** +* **de la vérification de types** + +...et **FastAPI** utilise ces mêmes déclarations pour : + +* **Définir les prérequis** : depuis les paramètres de chemins des requêtes, les entêtes, les corps, les dépendances, etc. +* **Convertir des données** : depuis la requête vers les types requis. +* **Valider des données** : venant de chaque requête : + * Générant automatiquement des **erreurs** renvoyées au client quand la donnée est invalide. +* **Documenter** l'API avec OpenAPI : + * ce qui ensuite utilisé par les interfaces utilisateur automatiques de documentation interactive. + +Tout cela peut paraître bien abstrait, mais ne vous inquiétez pas, vous verrez tout ça en pratique dans [Tutoriel - Guide utilisateur](tutorial/index.md){.internal-link target=_blank}. + +Ce qu'il faut retenir c'est qu'en utilisant les types standard de Python, à un seul endroit (plutôt que d'ajouter plus de classes, de décorateurs, etc.), **FastAPI** fera une grande partie du travail pour vous. + +!!! info + Si vous avez déjà lu le tutoriel et êtes revenus ici pour voir plus sur les types, une bonne ressource est la "cheat sheet" de `mypy`. diff --git a/docs/fr/mkdocs.yml b/docs/fr/mkdocs.yml index c0bbb2ac3..adb2ccc69 100644 --- a/docs/fr/mkdocs.yml +++ b/docs/fr/mkdocs.yml @@ -53,6 +53,7 @@ nav: - zh: /zh/ - features.md - fastapi-people.md +- python-types.md - Tutoriel - Guide utilisateur: - tutorial/background-tasks.md - alternatives.md