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:
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.
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.6
comme 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 PyCharm
s 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.
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.
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)