web-dev-qa-db-fra.com

Comment utiliser les indices de type dans python 3.6?

J'ai remarqué python 3.5 et python 3.6 a ajouté beaucoup de fonctionnalités sur la vérification de type statique, j'ai donc essayé avec le code suivant (dans python 3.6, version stable).

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)

Ce qui m'a surpris, c'est que python ne m'a pas donné d'erreur ou d'avertissement, bien que 1 a été ajouté à un list qui ne devrait contenir que des chaînes. Pycharm a détecté l'erreur de type et m'a donné un avertissement à ce sujet, mais ce n'était pas évident et il n'a pas été affiché dans la console de sortie, j'avais peur parfois de le manquer. Je voudrais les effets suivants:

  1. S'il est évident que j'ai utilisé le mauvais type comme indiqué ci-dessus, lancez un avertissement ou une erreur.
  2. Si le compilateur n'a pas pu vérifier de manière fiable si le type que j'ai utilisé était correct ou incorrect, ignorez-le.

Est-ce possible? Peut-être que mypy pourrait le faire, mais je préférerais utiliser la vérification de type de style python-3.6 (comme a: List[str]) au lieu du style de commentaire (comme # type List[str]) utilisé dans mypy. Et je suis curieux de savoir s'il y a un interrupteur en natif python 3.6 pour atteindre les deux points que j'ai dit ci-dessus.

38
Searene

Est-ce possible? Peut-être que mypy pourrait le faire, mais je préférerais utiliser la vérification de type de style Python-3.6 (comme a: List[str]) au lieu du style de commentaire (comme # type List[str]) utilisé dans mypy. Et je suis curieux de savoir s'il y a un interrupteur en natif python 3.6 pour atteindre les deux points que j'ai dit ci-dessus.

Il n'y a aucun moyen Python fera cela pour vous; vous pouvez utilisez mypy pour obtenir la vérification de type (et le vérificateur intégré de PyCharms devrait faire ça aussi). En plus de cela, mypy aussi ne restreint pas vous ne tapez que des commentaires # type List[str], vous pouvez utiliser des annotations variables comme vous le faites dans Python 3.6 donc a: List[str] fonctionne aussi bien.

Avec mypy tel quel, car la version est récente, vous devrez installer typed_ast et exécutez mypy avec --fast-parser et --python-version 3.6comme indiqué dans les documents de mypy . Cela va probablement changer bientôt, mais pour le moment, vous en aurez besoin pour le faire fonctionner correctement

Mise à jour: --fast-parser et --python-version 3.6 ne sont pas nécessaires maintenant.

Après cela, mypy détecte l'incompatibilité de la deuxième opération sur votre a: List[str] ça va. Supposons que votre fichier s'appelle tp_check.py avec déclarations:

from typing import List

a: List[str] = []
a.append('a')
a.append(1)
print(a)

Exécuter mypy avec les arguments susmentionnés (vous devez d'abord pip install -U typed_ast):

python -m mypy --fast-parser --python-version 3.6 tp_check.py

intercepte l'erreur:

tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"

Comme indiqué dans de nombreuses autres réponses sur l'indication de type avec Python, mypy et PyCharms sont les vérificateurs de type qui effectuent la validation, pas Python lui-même. Python n'utilise pas actuellement ces informations, il les stocke uniquement en tant que métadonnées et les ignore lors de l'exécution.

19

Les conseils de type sont entièrement destinés à être ignorés par le runtime Python, et ne sont vérifiés que par des outils tiers comme mypy et le vérificateur intégré de Pycharm. Il existe également une variété d'outils tiers moins connus qui le font). vérification de type au moment de la compilation ou de l'exécution à l'aide d'annotations de type, mais la plupart des gens utilisent mypy ou le vérificateur intégré AFAIK de Pycharm.

En fait, je doute que le contrôle de typage soit jamais intégré dans Python propre dans un avenir prévisible - voir la section "non-buts" de PEP 484 (qui introduit des annotations de type) et PEP 526 (qui a introduit des annotations variables), ainsi que les commentaires de Guido ici .

Personnellement, je serais heureux que la vérification de type soit plus fortement intégrée à Python, mais il ne semble pas que la communauté Python dans son ensemble soit prête ou disposée à un tel changement.

La dernière version de mypy devrait comprendre à la fois la syntaxe d'annotation variable Python 3.6 et la syntaxe de style commentaire. En fait, les annotations variables étaient essentiellement l'idée de Guido en premier lieu (Guido fait actuellement partie de l'équipe mypy) - en gros, la prise en charge des annotations de type dans mypy et dans Python a été développée à peu près simultanément.

29
Michael0x2a

Les annotations de type dans Python ne sont pas censées imposer le type. Tout ce qui implique une dépendance de type statique à l'exécution signifierait des changements si fondamentaux qu'il ne serait même pas logique de continuer à appeler le langage résultant "Python" .

Notez que la nature dynamique de Python permet à l'un de construire un outil externe, en utilisant du code pur-python, pour effectuer une vérification de type d'exécution. Cela ferait exécuter le programme (très) lentement, mais peut-être convient-il à certaines catégories de tests.

Pour être sûr - l'un des principes fondamentaux du langage Python est que tout est un objet et que vous pouvez essayer d'exécuter n'importe quelle action sur un objet au moment de l'exécution. Si l'objet ne possède pas de interface conforme à l'opération tentée, elle échouera - au moment de l'exécution.

Les langages par nature typés statiquement fonctionnent d'une manière différente: les opérations doivent simplement être disponibles sur les objets lorsqu'elles sont essayées au moment de l'exécution. À l'étape de compilation, le compilateur crée les espaces et les emplacements pour les objets appropriés partout - et, en cas de frappe non conforme, interrompt la compilation.

Le contrôle de typage de Python permet à n'importe quel nombre d'outils de faire exactement cela: interrompre et avertir à une étape avant d'exécuter réellement l'application (mais indépendamment de la compilation elle-même). Mais la nature du langage ne peut pas être modifiée pour obliger les objets à se conformer au moment de l'exécution - et il serait artificiel de taper et de rompre à l'étape de compilation elle-même.

Cependant, on peut s'attendre à ce que les futures versions de Python incorporent des vérifications de typage au moment de la compilation sur le runtime Python lui-même - très probablement via un commutateur de ligne de commande facultatif. ( Je ne pense pas que ce sera jamais par défaut - au moins pour ne pas casser la construction - peut-être qu'il peut être par défaut pour émettre des avertissements)

Donc, Python ne nécessite pas de vérification de type statique à l'exécution car il cesserait d'être Python. Mais au moins un langage existe qui utilise à la fois des objets dynamiques et un typage statique - le langage Cython, qui en pratique, fonctionne comme un sur-ensemble Python. Il faut s'attendre à ce que Cython incorpore la nouvelle syntaxe d'indication de type pour être une déclaration de type réelle très bientôt. (Actuellement, elle utilise un syntaxe différente pour les variables facultatives typées statiquement)

8
jsbueno