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.
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
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.
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 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.
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. Pour le dire autrement, cette ligne ondulée ennuyeuse est le mérite ultime de l'utilisation d'indices de caractères.
Nom de variable:Moule=valeur
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.
f: float = 1.0
f = 1 #1 est de type int, mais cast(Conversion de type)N'entraîne pas d'erreur
c: complex = 1 + 2j
s: str = 'hoge'
byte: bytes = b'test'
b: bool = True
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
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.
st: typing.Set[int] = {1, 2, 3}
Énumérez tous les types.
tpp: typing.Tuple[int, bool, str] = (1, True, 'test')
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.
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]
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]
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'
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.
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'
}
]
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.
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.
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.
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)
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