[PYTHON] Essayez les astuces de saisie

Aperçu

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.

outil

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

Aide-mémoire Mypy

installer mypy

(env) $ pip install mypy

Vérifier avec mypy

(env) $nom du module mypy

Exemple de définition d'indicateur de type

Par exemple, tous sont affichés sous forme de type entier (int).

Définition variable


a: int = 10
a: int
a = 10

Définition de l'argument de fonction

def f(a: int):
    pass

def f(a: int = 10):
    pass

Définition de la valeur de retour de fonction


def f(a) -> int:
    return 10

def f(a: int, b: int = 10) -> int:
    return a + b

Définition du type

Défini par type de données

Nom Moule
entier int
Nombre à virgule flottante float
Chaîne str
Type d'octet bytes
Valeur de vérité bool
None None

Système de conteneurs

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]

Type spécial

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]

Autre

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

int et float

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

Essayez les astuces de saisie
[Français] PEP 0484 - Conseils de type
Entraine toi! !! Introduction au type Python (conseils de type)
Augmentez la visibilité de la source avec des conseils de type
Type de coque
Dictionnaire type 2
Type de dictionnaire 1
essayez pysdl2
Essayez PyOpenGL
Vous voulez ajouter des indices de type aux décorateurs Python?