Typage moderne à partir de Python 3.8 vol.1 (sans classe)

introduction

J'ai récemment lu Programming TypeScript d'O'Reilly et j'ai été très impressionné. La profondeur et le plaisir des génériques, l'augmentation des informations sur les fonctions et les objets en raison de la présence de types et le sentiment de sécurité créé. Je suis devenu anxieux et incapable de faire une sieste sans moisissure.

À ce moment-là, j'ai décidé de l'annoncer à "Hida Takayama Python Mokumokukai" ce mois-ci également, et je pensais que c'était presque sans matière. C'est vrai, c'est amusant d'annoncer avec TypeScript qui m'a impressionné.

Heureusement, Python a également des indices de type. Je pensais que le système de types de Python était un peu plus pauvre que TypeScript, mais quand je l'ai recherché, pourquoi? Il avait toutes les fonctionnalités utiles (surtout après 3.8)

Dans cet article, je voudrais transmettre la profondeur, le plaisir et la commodité du système de moules à travers la série.

Je l'ai complètement couvert

Quand je l'ai écrit à mi-chemin, quand je regardais le programme PyCon JP2020, " Python 3.9 Comment maîtriser Python de type sécurisé à l'époque par. Mitsuki Ogasawara ”n'est-ce pas? Je pensais que c'était fait, mais je l'ai écrit, alors j'ai décidé d'aller tel quel. Tout le monde n'écrit pas la même chose. Fait partiellement référence à la notation après 3.9 et reflété dans ce contenu

Public cible

Certaines de ces personnes peuvent considérer cela comme un modèle. L'existence de la moisissure augmente la force musculaire (performance), mais elle est forcée d'être rigide et limitée dans les mouvements. Mais ce n'est pas le cas. Les moules sont programmables et productifs. Si vous le lisez jusqu'au bout, vous le comprendrez sûrement. Non, je peux comprendre. Je pense que je peux le faire. …… Je ferai de mon mieux pour l'écrire afin que vous puissiez le comprendre.

Je pense que ces personnes ont aussi de nouvelles découvertes. Il était étonnamment intéressant de taper le langage dynamique plus tard. C'est du TypeScript et des indices de type. Même ceux qui ont une expérience linguistique rude peuvent être surpris et découvrir le mécanisme intéressant du type Union et du type Literal.

Caractéristiques des indices de type Python

Cette section décrit les caractéristiques des indices de type Python et les utilisations qui peuvent être observées à partir de ces caractéristiques.

Les informations de type sont complètement ignorées au moment de l'exécution

Les informations de type sont ignorées au moment de l'exécution. Alors

C'est une sorte de chose subtile à première vue, pour ainsi dire, ** les indices de type ne sont que des commentaires **. …… Je peux voir que votre motivation diminue. Cependant, si vous regardez les indices de type comme des ** commentaires **, leur intensité devient apparente.

Comment est-ce, n'est-ce pas intéressant de le penser? Et cela aura l'air très puissant. ** En fait, c'est puissant **.

Au fait, je pense que la motivation de chacun s'est un peu rétablie. Mettons-nous en pratique maintenant.

Préparez-vous à l'avance avec VS Code

Cette fois, j'ai expérimenté avec VS Code et Pyright. Pour définir les droits d'auteur dans VSCode, voir ci-dessous.  https://qiita.com/simonritchie/items/33ca57cdb5cb2a12ae16

Quand vous le mettez dedans, cela ressemble à ceci. Des lignes ondulées ennuyeuses sortent. Screenshot from 2020-09-06 11-57-46.png Pour le dire autrement, cette ligne ondulée ennuyeuse est le mérite ultime de l'utilisation d'indices de caractères.

Comment écrire un type

Nom de variable:Moule=valeur

Type de base

int: type entier

i: int = 2
i = 1.1 ##type error! # 1.Erreur car 1 est float

Si vous mettez un type de variable différent dans le type, vous obtiendrez une ligne ondulée ennuyeuse. C'est ennuyeux alors réparons-le.

float: virgule flottante

f: float = 1.0
f = 1 #1 est de type int, mais cast(Conversion de type)N'entraîne pas d'erreur

complexe: type complexe

c: complex = 1 + 2j

str: type de chaîne

s: str = 'hoge'

byte: tableau d'octets

byte: bytes = b'test'

bool: valeur booléenne

b: bool = True

Type qui prend un argument de type

Les types présentés ici sont d'excellents types qui prennent d'autres types comme arguments de type (comme des arguments). Pour ainsi dire, tapez abstraction et programmation. Décrivez en utilisant la saisie.

import typing

La notation est la suivante.

Nom de variable:Nom du modèle[Argument de type] =valeur

liste: liste

lst: typing.List[int] = [1, 2, 3] 
lst2: list[int] = [0,1,2] # Python3.Notation utilisable après 9

Si vous vous demandez si vous pouvez faire une liste avec un peu plus de liberté, elle sortira plus tard.

set: liste unique

st: typing.Set[int] = {1, 2, 3}

tuple: tableau de longueur fixe avec le type et la longueur spécifiés

Énumérez tous les types.

tpp: typing.Tuple[int, bool, str] = (1, True, 'test')

dict: dictionnaire

Dict [type de clé, type de valeur]

dic: typing.Dict[str, int] = {'name': 1, 'age': 2}
dic1: dict[str, int] = {'test': 1} # Python3.Notation utilisable après 9

C'est une bonne nouvelle pour ceux qui pensent que les dictionnaires compliqués ne peuvent pas être utilisés. Plus tard, il y aura moyen de spécifier plus finement.

Tapez un alias

Je pense que c'était à peu près à l'époque où je pensais que ces informations de type duraient longtemps. Il existe des alias de types qui peuvent être appelés des versions variables de types pour ceux qui sont impatients, ou pour ceux qui sont pragmatiques qui veulent donner des noms aux types qu'ils ont créés et les gérer de manière facile à comprendre.

TupleIBS = typing.Tuple[int, bool, str]

Type sélectionnable

Union: type d'énumération

Union [Type 1, Type 2, Type 3 ...] Il peut s'agir de l'un des types répertoriés dans l'argument type.

uni: typing.Union[int, bool] = 1
uni = False
uni3: int | bool = 1 # Python3.Notation utilisable à partir de 10

Les moules peuvent être combinés pour un effet encore plus grand. J'ai mentionné plus tôt une liste plus flexible. Faisons-le ici.

list_ib: typing.List[typing.Union[int, bool]] = [1, True, 2, False]

Littéral: type littéral (* Python 3.8 ou version ultérieure)

C'est une fonction divine. ~~ C'est une fonction divine pour que vous ne compreniez pas pourquoi il y a peu de références dans les pays de langue japonaise. Êtes-vous lécher? ~~ Il y avait une mention dans la performance de PyCon JP2020. En un mot, c'est un type constant. Une représentation de type plus limitée est possible. De plus, il existe une fonction d'énumération. fort.

li1: typing.Literal[1] = 1 #Véritable constante
li2: typing.Literal['hoge', 'fuga'] = 'fuga' #Plusieurs descriptions sont possibles
li2 = 'hoge'

Final (* Python 3.8 ou version ultérieure)

Vous pouvez exprimer immuable (universel). Cependant, il existe quelques écueils.

c: typing.Final[str] = 'c'
c = 'a' ##type error!
lis: typing.Final[typing.List[int]] = [1,2,3]
lis[1] = 1 #Pas d'erreur

Eh bien, utilisons tuple docilement dans de tels cas.

TypedDict: dictionnaire typé (* Python 3.8 ou version ultérieure)

Vous pouvez taper le dictionnaire plus finement. Et si vous lisez ceci attentivement et que vous l'écrivez réellement, vous trouverez la commodité du système de type.

#Décrire les informations de type du dictionnaire en utilisant la notation de classe
class UserDict (typing.TypedDict): #Hériter de TypedDict
    name: str
    age: Optional[int] #Aucun Activer ≒ Union[int, None]
    sex: typing.Literal['men', 'women', 'other']

users: typing.List[UserDict] = [
    {
        'name': 'noji', #Chaîne de caractères uniquement
        'age': 33,      #Numérique ou Aucun uniquement
        'sex': 'men'    #"Kan" ne peut pas être entré. L'aide à la saisie est également efficace.
    },
    {
        'name': 'superwomen',
        'age': None,
        'sex': 'women'
    }
]

Résumé: Profitons avec le moule

Cette fois, j'ai expliqué les types de base (presque pas de classes). Je pense que vous pouvez voir la signification du type étant programmable et un commentaire utile qui fonctionne également pour l'EDI. Même si vous n'y pensez que, vous pouvez y voir ** restreindre les choix de types de dictionnaires et d'arguments **. Le type Literal est très utile lors de la spécification d'options sous forme de chaîne. Cela réduira également vos soucis lors de la prise et de l'utilisation de JSON dont la forme est connue. Si vous connaissez le type, l'intelligence fonctionnera, elle est donc parfaite même lorsque vous utilisez une classe avec laquelle vous n'êtes pas familier. Je suis content de pouvoir taper de manière flexible parce que j'ai tapé la langue qui n'avait pas de type à l'origine.

Avec un moule, vous pouvez vous amuser beaucoup avec un peu d'effort. Ce sera d'une grande aide pour maîtriser la ** paresse ** des trois grandes vertus des programmeurs. Maintenant, faisons une programmation facile et amusante avec des moules.

Annexe: En cas de moisissure

Mais c'est fou. Parfois, je souffre de moisissures. Je veux juste écrire de la logique, pourquoi est-ce que je combat cette erreur de type? Comme. Dans un tel cas, pensons qu'il n'y a rien de mal à faire des compromis.

Inférence de type

Tant que vous ne réécrivez pas la variable une seule fois, ** l'inférence de type ** fonctionne efficacement, vous n'avez donc pas à vous soucier d'écrire le type. En fait, j'écris également uniquement les informations de type suivantes.

boo = True #L'EDI en déduit automatiquement qu'il est de type booléen et agit sur celui-ci
boo = 1 #Cependant, le type change (ou devient Any) au moment de la réécriture.

cast: conversion de type

Si vous ne disposez pas des informations de type ou si vous avez des problèmes, essayez de les utiliser. Pourquoi est-ce si utile? L'abus est strictement interdit car il peut être converti de force.

i3: int = typing.cast(int, 1.0)

Tout: tout type

C'est le monde de Python sans indices de type. C'est un médicament assez puissant.

ani: typing.Any = 1
ani = 'hoge'
ani = ['fuga', 129999, True]

Recommended Posts

Typage moderne à partir de Python 3.8 vol.1 (sans classe)
"Programmation Python AI" à partir de 0 pour Windows
Efficacité commerciale à partir de zéro avec Python
Générer une classe à partir d'une chaîne en Python
Typage Python
Construction d'environnement explosif Python à partir de zéro (Mac)
Inscription auprès de PyPI à partir de la bibliothèque Python moderne faite par vous-même
[Python] classe, instance
À propos de python, classe
Typage dynamique de Python
sql à sql
[Python] Comprenez la classe self. Apprenez le rôle de soi à partir du résultat de l'exécution avec ou sans soi.
MeCab de Python
classe python, instance
Les bases de #Python (classe)
[Python] Lecture du code source Django Vue à partir de zéro ①
Introduction aux mathématiques à partir du mémo d'étude Python Vol.1