53 votes

Comment utiliser les indications de type dans Python 3.6?

J'ai remarqué python 3.5 et python 3.6 ajout d'un grand nombre de fonctionnalités sur la vérification des types statiques, alors j'ai essayé avec le code suivant(en 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 est que, python ne me donne pas une erreur ou un avertissement, bien qu' 1 a été ajouté à un list qui ne doit contenir que des chaînes de caractères. Pycharm détecté le type d'erreur et m'a donné un avertissement à ce sujet, mais il n'est pas évident et il n'était pas indiqué dans la sortie de la console, j'ai eu peur il m'arrive parfois de manquer. Je voudrais les effets suivants:

  1. Si il est évident que j'ai utilisé le mauvais type tel qu'il est indiqué ci-dessus, jeter un avertissement ou d'erreur.
  2. Si le compilateur ne pouvais pas vérifier de façon fiable si le type que j'ai utilisé était de bonne ou de mauvaise, de l'ignorer.

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

41voto

Michael0x2a Points 9116

Type de conseils sont entièrement destiné à être ignoré par le runtime de Python, et sont vérifiés par 3e parti des outils comme mypy et Pycharm intégré de checker. Il existe également une variété de moins connue 3ème partie outils qui ne le typage à la compilation ou de l'exécution en utilisant les annotations de type, mais la plupart des gens utilisent mypy ou Pycharm intégré du vérificateur autant que je sache.

En fait, en fait, je doute que le typage sera jamais intégré à Python appropriée dans la foreseable avenir -- voir le " non-objectifs de la section de PEP 484 (qui a introduit les annotations de type) et PEP 526 (qui a introduit la variable d'annotations), ainsi que Guido commentaires ici.

Je serais personnellement d'être heureux avec une vérification de type à être plus fortement intégrée avec Python, mais il ne semble pas que le Python ensemble de la collectivité est prête pour un tel changement.

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

24voto

Jim Points 8793

Est-ce possible? Peut-être mypy pourrait le faire, mais je préfère utiliser Python-3.6-type de style de vérification (comme a: List[str]) au lieu de le commentaire de style (comme # type List[str]) utilisé dans mypy. Et je suis curieux de savoir si 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 aucune façon Python va le faire pour vous; vous pouvez utiliser mypy pour obtenir le type de contrôle (et PyCharms intégré vérificateur devrait le faire aussi). En outre, mypy également de ne pas restreindre vous seul type de commentaires # type List[str], vous pouvez utiliser la variable d'annotations que vous ne vous en Python 3.6 donc a: List[str] fonctionne aussi bien.

Avec mypy comme c'est, parce que la libération est frais, vous aurez besoin d'installer typed_ast et exécuter mypy avec --fast-parser et --python-version 3.6 comme indiqué dans mypy de docs. Cela va probablement changer bientôt mais pour l'instant, vous en aurez besoin pour obtenir le bon déroulement

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

Après vous faites cela, mypy détecte l'incompatibilité de la deuxième opération sur votre a: List[str] l'amende juste. Disons que votre fichier s'appelle tp_check.py déclarations:

from typing import List

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

L'exécution mypy avec les arguments ci-dessus (vous devez d'abord pip install -U typed_ast):

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

les captures de l'erreur:

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

Comme indiqué dans de nombreux autres réponses sur le type hinting avec Python, mypy et PyCharms' type-les pions sont les personnes qui effectuent la validation, pas de Python lui-même. Python n'utilise pas cette information actuellement, il ne la stocke sous forme de métadonnées et il ne tient pas compte lors de l'exécution.

11voto

jsbueno Points 22212

Les annotations de Type Python ne sont pas destinés à être de type application. Tout ce qui concernait l'exécution de type statique de dépendance implique des changements fondamentaux qu'il ne serait même pas de sens de continuer à appeler la résultante de la langue "Python".

Notez que la nature dynamique de Python permet de construire un outil externe, à l'aide de pur-code python, pour effectuer la vérification de type à l'exécution. Il permettrait de faire fonctionner le programme (très) lentement, mais peut-être il est adapté pour certaines catégories test.

Pour être sûr que l'un des fondamentaux du langage Python, c'est que tout est un objet, et que vous pouvez essayer de réaliser une action sur un objet lors de l'exécution. Si l'objet n'a pas une interface qui est conforme avec la tentative d'opération, il ne pourra pas - au moment de l'exécution.

Les langues qui sont, par nature, typé statiquement travail d'une manière différente: les opérations de simplement être disponibles sur les objets lorsqu'on l'a essayé au moment de l'exécution. À l'étape de compilation, le compilateur crée des espaces et des emplacements pour les objets appropriés tous sur la place - et, sur la non-conformité de frappe, les pauses de la compilation.

Python est le typage permet à n'importe quel nombre d'outils pour faire exactement cela: briser et de les avertir lors d'une étape avant l'exécution de l'application (mais indépendant de la compilation elle-même). Mais la nature de la langue ne peut pas être modifié pour exiger que les objets à respecter dans l'exécution, et veryfying la saisie et la rupture à l'étape de compilation elle-même serait artificiel.

Bien que, on peut s'attendre à ce que les futures versions de Python peut incoroporate au moment de la compilation vérification de type à l'exécution Python lui-même - le plus probable, à travers et en option de la ligne de commande. (Je ne pense pas que ce sera jamais par défaut - au moins pour ne pas casser le build - peut-être, il peut être fait par défaut pour l'émission d'avertissements)

Donc, Python ne nécessite pas statique de la vérification de type à l'exécution, car il cesserait d'être Python. Mais au moins une langue existe qui permet d'utiliser à la fois des objets dynamiques et le typage statique - la Cython de la langue, qui, dans la pratique, fonctionne comme un sur-ensemble de Python. Il faut s'attendre à Cython pour incorporer la nouvelle type-hinting syntaxe pour être de type réel-déclarant très bientôt. (Actuellement, il utilise une syntaxe différente pour l'option statiquement typé variables)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X