J'ai lu PEP 585 (Type Hinting Generics In Standard Collections)
Lorsque j'enquêtais sur l'origine de l'attribut «origin», le PEP PEP 585 --Type Hinting Generics In Standard Collections Je l'ai trouvé, alors j'ai oublié le but initial et je l'ai écrémé. Je suis toujours en état de brouillon, donc je ne suis pas sûr qu'il sera adopté à l'avenir, mais je prendrai note de ma compréhension.
Aperçu
- Les annotations de type précédentes utilisaient des types dédiés pour représenter des collections (telles que
typing.List
et typing.Dict
).
- Intégrez l'implémentation de la collection et les classes de type pour autoriser les classes de collection standard (telles que
list
et dict
) pour l'annotation de type
- Je veux supprimer le type de collection générique sous
typing
le terme
- Generic
- Type paramétrable. Fait généralement référence à un conteneur.
- Également appelé type paramétrique et type générique.
- Exemple:
dict
- parametrized generic
- Une instance de Generic qui spécifie le type d'élément conteneur
- Également appelé type paramétré.
- Exemple:
dict [str, int]
approche
Utilisez list
ou dict
au lieu de la précédente typing.List
ou typing.Dict
. c'est tout.
def find(haystack: dict[str, list[int]]) -> int:
...
Ce qu'il ne faut pas faire
- Ne prend pas en charge ʻis instance (obj, list [int]) `
- Ne prend pas en charge ʻissubclass (cls, list [str]) `
Note
En interne, il est censé créer une instance de types.GenericAlias
. Par conséquent, les informations de type peuvent être récupérées en utilisant __origin__
ou __args__
.
StrList = list[str]
assert isinstance(StrList, types.GenericAlias)
assert StrList.__origin__ is list
assert StrList.__args__ is (str,)
Impressions
- Ce n'est pas simple d'avoir un type dédié aux annotations en dehors de la classe que vous utilisez habituellement, donc cela semble très bien (même si j'y suis habitué)
- Il est difficile de crier avec l'ancien code lorsque le type générique de frappe est aboli (environ 5 ans plus tard?)
- Au fur et à mesure que la version de Python3 progresse, je pense que les annotations de type sont fortement liées à la spécification du langage Python.
- Le vérificateur de type est toujours à l'extérieur, mais lors de l'écriture de Python, il semble que le flux devrait être d'écrire la forme ...
- J'ai le sentiment qu'il ne s'arrêtera pas une fois qu'il sera utilisé dans les performances et les tests
Postscript
Avant que je ne le sache, il a été décidé d'adopter PEP 585 (Accepté), et il était disponible en 3.9.0a6. Voici l'état de 3.9-dev installé il y a quelque temps.
$ python3.9
Python 3.9.0a6+ (heads/master:7f7e706, May 9 2020, 13:35:20)
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> list[int]
list[int]
>>> dict[str, int]
dict[str, int]
>>> tuple[int, ...]
tuple[int, ...]