Entraine toi! !! Introduction au type Python (conseils de type)

introduction

Utilisez-vous les indices de type de Python? Puisque Python est un langage typé dynamiquement, certaines personnes peuvent trouver avantageux de pouvoir coder sans informations de type explicites. Cette opinion est valable, mais je pense qu'il est également vrai qu'en spécifiant explicitement le type, il est possible de coder moins sujet aux bogues. Cet article traite d'une introduction au contenu intermédiaire sur les types Python. J'espère que cela vous aidera à améliorer vos compétences Python.

Remarques

Une bibliothèque appelée mypy est nécessaire pour l'analyse de type statique de Python, mais je n'expliquerai pas comment utiliser mypy et comment l'installer.

Étape 1: type de variable de base [immuable]

Comment écrire le type de variable est la suivante.

<Nom de variable>:<Moule>
<Nom de variable>:<Moule> = <valeur initiale>

Lors de son utilisation réelle, ce sera comme suit.

test: int = 12
test2: bool = True
test3: str = 'Hello'
test4: float = 1.12

test = 'hello'  #J'obtiens une erreur mypy

J'ai une variable appelée test définie dans int, mais lorsque j'essaie d'attribuer une chaîne, j'obtiens une erreur mypy. ** J'obtiens une erreur mypy, mais le code lui-même fonctionne correctement. ** **

Étape 2: type de variable de base [Mutable]

Ensuite, regardons les dictionnaires et les types de tableaux.

test5: list = [1, 2, 3]
test6: dict = {'name': 'taro'}

test5 = 12 #J'obtiens une erreur mypy
test6 = 'Name' #J'obtiens une erreur mypy

J'ai défini test5 comme un tableau et test6 comme un dictionnaire, donc si j'essaie d'attribuer une autre valeur, j'obtiens une erreur mypy. La définition de type ci-dessus est correcte, mais nous vous recommandons d'utiliser la saisie List et Dict pour les tableaux et les dictionnaires.

from typing import List, Dict

test7: List[int] = [1, 2, 3] #Peut être réduit aux séquences int uniquement
test8: Dict[str, str] = {'name': 'taro'} #Vous pouvez restreindre les clés et les valeurs du dictionnaire à str uniquement

Pour test5 et test6, vous ne pouvez définir le type que sous la forme d'un tableau ou d'un dictionnaire. Cependant, dans le cas de test7 et test8, il est possible de spécifier des types plus détaillés tels qu'un tableau d'entiers et un dictionnaire avec des clés et des valeurs de str. Fondamentalement, nous vous recommandons d'utiliser ceci.

Étape 3: Si vous autorisez plusieurs types

Je pense qu'il existe de nombreuses situations dans lesquelles vous souhaitez autoriser int et str pour une variable. Dans ce cas, utilisez Union.

from typing import Union

test9: Union[int, str] = 10 #Autoriser int et str
test9 = 'Name' # OK
test9 = bool #J'obtiens une erreur mypy

J'ai défini test9 comme une variable qui autorise int et str, donc j'obtiens une erreur mypy lorsque j'essaye d'attribuer la valeur de bool.

Étape 4: type de fonction

Forme basique

La forme de base du type de fonction est la suivante.

def <Nom de la fonction>(<Nom de variable>:<Moule>) -><戻り値のMoule>:
    ...

Lors de son utilisation réelle, ce sera comme suit.

def add(x: int, y: int) -> int:
    return x + y

[Astuces] Utilisez float au lieu de Union [int, float] lorsque int et float sont attendus.

En fait, l'erreur mypy ne se produit pas même si vous affectez la valeur de int ou la variable à la variable définie par float. Vous pouvez le définir avec Union [int, float], mais il est recommandé de le définir avec float car le code sera plus propre.

#Si la variable doit être à la fois int et float, tapez-la avec float
def add(x: float, y: float) -> float:
    return x + y

a: int = 1
add(a, 2) # OK

Pour les fonctions sans valeur de retour

Souvent, il n'y a pas de valeur de retour pour la fonction. Dans ce cas, définissez le type de retour sur Aucun.

def log_print(number: int) -> None:
    print('La valeur est{}est'.format(number))

b = log_print(12) # mypy error

Si vous essayez d'attribuer la valeur de retour d'une fonction qui n'a pas de valeur de retour à la variable b, vous obtiendrez une erreur mypy.

Étape 5: utilisez facultatif si aucun n'est autorisé

Si vous utilisez la méthode get sur un dictionnaire, elle renverra la valeur correspondante si la clé existe dans le dictionnaire, ou None si la clé n'existe pas. Dans ce cas, vous pouvez définir un type qui autorise la valeur + Aucun dans Union, mais vous pouvez utiliser Facultatif pour écrire le code proprement.

from typing import Optional

test10: Dict[str, str] = {'name': 'taro'}
test11: Optional[str] = test10.get('name') # str+N'autoriser aucun
test11 = test10.get('age') #Aucun retourne

Dans le cas ci-dessus, test11 peut être défini comme un type qui autorise str et None.

Étape 6: Définissez un type de dictionnaire plus détaillé [TypedDict]

Je pense que le type de dictionnaire est souvent utilisé dans le codage. J'ai déjà mentionné que vous pouvez utiliser la saisie de Dict pour affiner plus en détail les types de clé et de valeur, mais vous pouvez affiner plus en détail.

from typing import TypedDict

Movie = TypedDict('Movie', {'name': str, 'year': int})

movie: Movie = {'name': 'Blade Runner', 'year': 1982}
movie['age'] = 10  # mypy error
print(movie.get('author'))  # mypy error

En écrivant comme ci-dessus, il est possible de définir le type que Movie a une valeur de clé de nom de str et année a une valeur de clé de int. Bien sûr, si vous essayez d'ajouter ou de référencer des données avec une clé non définie, vous obtiendrez une erreur mypy.

Étape 7: Définition du type de classe

Il n'y a rien de plus que l'explication jusqu'à présent en ce qui concerne les cours. Il est possible de saisir des variables membres et des fonctions membres.

from dataclasses import dataclass

@dataclass
class Student:
    name: str
    student_number: str

    def print_information(self) -> None:
        print('Name: {}, Student Number: {}'.format(self.name, self.student_number))


taro = Student('taro', '1234')
taro.print_information()
print(taro.age)  # mypy error

Bien sûr, le code ci-dessus entraînera une erreur car la classe Student n'a pas de variable membre appelée age defined.

Étape 8: à propos de tout

Si Any est ajouté, la cohérence de type sera ignorée.

from typing import Any

#Peut être défini comme une variable qui accepte n'importe quel type en ajoutant Any
test12: Any = {'name': 'taro', 'age': 12} 
test12 = 'Hello' # No mypy Error

Non seulement vous pouvez attribuer une valeur à cette variable avec Any, mais cela peut également être dangereux dans de nombreuses situations.

from typing import Any
test13: int = 10
test13 = test12  #Les variables définies par Any peuvent être affectées à n'importe quelle variable

def sub(x: float, y: float) -> float:
    return x - y

test14: Any = 'Hello'
sub(test14, 12.1)  #Autorise une chaîne même si elle ne doit pas contenir de chaîne

Si vous définissez une variable avec Any, lors de l'affectation de cette variable à une autre variable, la vérification de type telle que lorsque vous l'utilisez comme argument d'une fonction est ignorée. Par conséquent, l'utilisation de Any est strictement interdite car elle peut provoquer un comportement inattendu. Je pense qu'il vaut mieux ne pas écrire une définition de type que d'utiliser Any.

Bonus: tapez un alias

Il est rarement utilisé, mais il est possible de donner au type un alias.

#Donnez au type un alias
UserData = Dict[str, Union[str, List[Dict[str, str]]]]

hanako: UserData = {
    'user-id': '1234',
    'belongings': [{'id': '12', 'name': 'PC'}, {'id': '23', 'name': 'Tablet'}],
}

finalement

Cet article traite du contenu de niveau basique à intermédiaire. Il y a des contenus plus difficiles en plus des contenus traités cette fois, mais je pense que les contenus traités cette fois ne suffisent pas pour coder normalement. En ce qui concerne les types Python, la référence de mypy est détaillée et facile à comprendre, donc je pense qu'il serait bon de s'y référer. mypy Type hints cheat sheet J'espère que cela aide même un peu votre codage. Puis (* ^ ▽ ^ *)

Recommended Posts

Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à l'application Udemy Python3 +] 28. Type collectif
[Introduction à l'application Udemy Python3 +] 21. Type Taple
[Introduction à l'application Udemy Python3 +] 24. Type de dictionnaire
[Introduction à l'application Udemy Python3 +] 16. Type de liste
Introduction au langage Python
Introduction à OpenCV (python) - (2)
Vous voulez ajouter des indices de type aux décorateurs Python?
Introduction à Python Django (2) Win
Introduction à la communication série [Python]
[Introduction à Python] <liste> [modifier le 22/02/2020]
Introduction à Python (version Python APG4b)
Une introduction à la programmation Python
Introduction à Python pour, pendant
[Introduction à cx_Oracle] (Partie 6) Mappage des types de données DB et Python
[Présentation de l'application Udemy Python3 +] 31. Commentaire
Introduction à la bibliothèque de calcul numérique Python NumPy
[Introduction à Python3 Jour 1] Programmation et Python
[Introduction à Python] <numpy ndarray> [modifier le 22/02/2020]
[Présentation de l'application Udemy Python3 +] 57. Décorateur
Introduction à Python Hands On Partie 1
[Introduction à Python3 Jour 13] Chapitre 7 Chaînes de caractères (7.1-7.1.1.1)
[Introduction à Python] Comment analyser JSON
[Présentation de l'application Udemy Python3 +] 56. Clôture
[Introduction à Python3 Jour 14] Chapitre 7 Chaînes de caractères (7.1.1.1 à 7.1.1.4)
Introduction à Protobuf-c (langage C ⇔ Python)
[Présentation de l'application Udemy Python3 +] 59. Générateur
[Introduction à Python3 Jour 15] Chapitre 7 Chaînes de caractères (7.1.2-7.1.2.2)
[Introduction à Python] Utilisons les pandas
[Introduction à Python] Utilisons les pandas
[Introduction à l'application Udemy Python3 +] Résumé
Introduction à l'analyse d'image opencv python
[Introduction à Python] Utilisons les pandas
Premiers pas avec Python pour les non-ingénieurs
Introduction à Python Django (2) Édition Mac
[AWS SAM] Présentation de la version Python
[Introduction à Python3 Day 21] Chapitre 10 Système (10.1 à 10.5)
[Tutoriel Python] Une introduction facile à Python
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 1
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 2
[Introduction à Udemy Python3 + Application] 18. Méthode List
[Introduction à Udemy Python3 + Application] 63. Notation d'inclusion du générateur
[Introduction à Python] Comment utiliser la classe en Python?
Réintroduction aux décorateurs Python ~ Apprenons les décorateurs par type ~
[Introduction à Udemy Python3 + Application] 25. Méthode de type dictionnaire
Introduction à la simulation d'événements discrets à l'aide de Python # 1
[Introduction à Udemy Python3 + Application] 13. Méthode de caractères
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.1-8.2.5)
[Introduction à l'application Udemy Python3 +] 55. Fonctions intégrées
[Introduction à l'application Udemy Python3 +] 48. Définition des fonctions
[Introduction à Python3, jour 17] Chapitre 8 Destinations de données (8.3-8.3.6.1)
Super Introduction Arithmétique Bit Python
[Introduction à l'application Udemy Python3 +] 10. Valeur numérique
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
Web-WF Python Tornado Partie 3 (Introduction à Openpyexcel)
[Introduction à l'application Udemy Python3 +] 45. fonction enumerate
[Introduction à l'application Udemy Python3 +] 41. fonction d'entrée
[Introduction à Python] Utilisons foreach avec Python
[Introduction à Python3 Jour 19] Chapitre 8 Destinations de données (8.4-8.5)
[Introduction à l'application Udemy Python3 +] 17. Opération de liste
[Introduction à l'application Udemy Python3 +] 65. Gestion des exceptions