PEP 484: Type Hints a été introduit dans Python 3.5. Pour plus d'informations, voir Prise en charge des indices de type de document officiel (https://docs.python.org/en/3/library/typing.html).
Récemment, j'ai entendu beaucoup d'histoires qui ont été introduites dans la communauté. Je voudrais également l'introduire dans de futurs projets, et je vais le résumer ici pour référence lorsque je m'étudie et que je l'explique aux autres.
Les indices de type ont été introduits dans Python 3.5 et versions ultérieures en tant que syntaxe Python.
--Il existe un outil de vérification de facto appelé mypy (installable avec pip) ―― Des éditeurs tels que PyCharm le supportent, l'interpolation de code devient puissante et elle vérifie également. --Valide uniquement à l'endroit où l'indication est décrite (unité de module ou unité de fonction) ―― Plus vous écrivez d'indices, plus l'interpolation de code sera efficace et plus elle sera vérifiée.
installer mypy
(env) $ pip install mypy
Vérifier avec mypy
(env) $nom du module mypy
Par exemple, tous sont affichés sous forme de type entier (int).
a: int = 10
a: int
a = 10
def f(a: int):
pass
def f(a: int = 10):
pass
def f(a) -> int:
return 10
def f(a: int, b: int = 10) -> int:
return a + b
Nom | Moule |
---|---|
entier | int |
Nombre à virgule flottante | float |
Chaîne | str |
Type d'octet | bytes |
Valeur de vérité | bool |
None | None |
Puisque le système de conteneur spécifie le type à inclure, je veux l'écrire comme list [int]
. Cependant, cela entraîne une erreur de syntaxe Python. Pour cette raison, la frappe prépare un moule dédié.
from typing import List, Tuple, Dict, Set
Nom | Moule | Exemple de définition |
---|---|---|
liste | List | List[int] |
Taple | Tuple | Tuple[int, int] / Tuple[int, ...] |
dictionnaire | Dict | Dict[str, int] |
ensemble | Set | Set[int] |
from typing import Any
Nom | Moule | Exemple de définition |
---|---|---|
Tout va bien | Any | Any |
from typing import Callable, Iterator, MutableMapping
Nom | Moule | Exemple de définition |
---|---|---|
Appelable | Callable | Callable[[int, float], bool] |
Répétable | Iterator | Iterator[int] |
Comportement comme un dictionnaire | MutableMapping | MutableMapping[str, int] |
Optional
Facultatif est un type qui autorise le type spécifié ou Aucun. Par exemple, ʻOptional [int] `pour autoriser les entiers ou Aucun.
Il est utilisé dans les cas suivants.
from typing import Optional
def f1(a: int, b: int) -> Optional[int]:
if b == 0:
return None
return a // b
C'est pratique car il peut être utilisé comme suit.
def f2(c: Optional[int]) -> int:
if c is None:
c = 0
return c + 100
Si vous décrivez le cas ci-dessus comme suit, mypy vous informera de l'erreur.
def f2(c: Optional[int]) -> int:
return c + 100
$ mypy sample.py
sample.py:**: error: Unsupported operand types for + ("None" and "int")
sample.py:**: note: Left operand is of type "Optional[int]"
Found 1 error in 1 file (checked 1 source file)
Autrement dit, en faisant «si c est None», nous ajoutons le temps où c est None, et dans les lignes suivantes, la variable c. Est déterminé comme étant un type entier (int), nous garantissons donc qu'il peut être traité sans problème.
Union
L'union peut indiquer l'un des deux types. Par exemple, lorsque vous dites type entier ou type chaîne, spécifiez ʻUnion [int, str] `.
Lorsque vous recevez un argument comme indiqué ci-dessous, utilisez-le lorsque vous ne savez pas s'il s'agit d'un entier ou d'une chaîne de caractères, et en divisant le processus en utilisant ʻisinstance`, vous pouvez déterminer le type de la variable comme avec facultatif ci-dessus. Je peux le faire.
from typing import Union
def f3(d: Union[int, str]) -> str:
if not isinstance(d, str):
d = str(d)
return d.upper()
Ici, comme ʻ if not is instance (d, str): , quand la variable d n'est pas un type string (str), le processus de conversion en chaîne est inséré et le processus se poursuit. Puisque
return d.upper () sait que
d` est une chaîne, nous pouvons utiliser une méthode de type chaîne pour la convertir en majuscules en toute sécurité.
Vous ne pouvez pas spécifier un float en spécifiant int, mais vous pouvez spécifier un float opposé et insérer un int. Dans les cas suivants, seul num4 donnera une erreur.
num1: float = 1.0
num2: float = 1
num3: int = 1
num4: int = 1.0 #Cela entraînera une erreur
$ mypy sample/sample.py
sample.py:**: error: Incompatible types in assignment (expression has type "float", variable has type "int")
Il semble que cela soit dû au fait que int peut être automatiquement converti en float, mais si le float opposé est changé en int, des informations peuvent être perdues.
Recommended Posts