Sea*_*ene 40 python type-hinting python-3.x python-3.6 mypy
我注意到python 3.5和python 3.6增加了很多关于静态类型检查的功能,所以我尝试使用以下代码(在python 3.6中,稳定版本).
from typing import List
a: List[str] = []
a.append('a')
a.append(1)
print(a)
Run Code Online (Sandbox Code Playgroud)
让我感到惊讶的是,python没有给我一个错误或警告,虽然1附加到一个list只应该包含字符串.Pycharm检测到类型错误并给我一个警告,但它并不明显,它没有在输出控制台中显示,我害怕有时我可能会错过它.我想要以下效果:
那可能吗?也许mypy可以做到,但我更喜欢使用python-3.6-style类型检查(比如a: List[str])而不是使用的注释风格(如# type List[str])mypy.而且我很好奇是否在本机python 3.6中有一个切换来实现我上面提到的两点.
Mic*_*x2a 33
类型提示完全被Python运行时忽略,并且仅由第三方工具(如mypy和Pycharm的集成检查器)进行检查.还有一些鲜为人知的第三方工具使用类型注释在编译时或运行时进行类型检查,但大多数人使用mypy或Pycharm的集成检查器AFAIK.
事实上,我实际上怀疑在可预见的未来,类型检查将永远集成到Python中 - 参见PEP 484(引入类型注释)和PEP 526(引入变量注释)的'非目标'部分,以及作为圭多的评论在这里.
我个人很高兴类型检查与Python的集成程度更高,但似乎整个Python社区都没有准备好或愿意做出这样的改变.
最新版本的mypy应该理解Python 3.6变量注释语法和注释样式语法.事实上,变量注释基本上是Guido的想法(Guido目前是mypy团队的一部分) - 基本上,mypy和Python中的类型注释的支持几乎同时开发.
Jim*_*ard 19
那可能吗?也许mypy可以做到,但我更喜欢使用Python-3.6风格的类型检查(比如
a: List[str])而不是# type List[str]mypy中使用的注释风格(如).而且我很好奇是否在本机python 3.6中有一个切换来实现我上面提到的两点.
Python不会为你做这件事; 您可以使用它mypy来进行类型检查(PyCharms内置检查器也应该这样做).除此之外,mypy也不会限制你只能输入评论# type List[str],因为你在Python 3.6你可以使用可变注解,a: List[str]同样适用.
随着mypy原样,因为发布是新鲜的,你需要安装typed_ast和执行mypy以--fast-parser和--python-version 3.6 为记录在mypy的文档.这可能会很快改变,但现在你需要它们才能顺利运行
更新: --fast-parser和--python-version 3.6现在是不需要的.
执行此操作后,mypy会检测到您的第二次操作不兼容a: List[str].假设您的文件tp_check.py使用语句调用:
from typing import List
a: List[str] = []
a.append('a')
a.append(1)
print(a)
Run Code Online (Sandbox Code Playgroud)
运行mypy前面提到的参数(你必须先pip install -U typed_ast):
python -m mypy --fast-parser --python-version 3.6 tp_check.py
Run Code Online (Sandbox Code Playgroud)
捕获错误:
tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
Run Code Online (Sandbox Code Playgroud)
如上所述在与Python类型提示许多其他的答案,mypy和PyCharmS'型,跳棋是进行验证的,而不是Python本身.Python目前不使用此信息,它仅将其存储为元数据并在执行期间忽略它.
在Python中键入注释并不意味着类型强制.涉及运行时静态类型依赖性的任何事情都意味着变化非常重要,以至于继续调用生成的语言"Python"甚至都没有意义.
请注意,Python的动态特性允许使用pure-python代码构建外部工具来执行运行时类型检查.这将使程序运行(非常)缓慢,但它可能适用于某些测试类别.
可以肯定的是 - Python语言的基础之一是所有东西都是对象,并且您可以尝试在运行时对对象执行任何操作.如果对象未能具有符合尝试操作的接口,则它将在运行时失败.
静态类型的语言以不同的方式工作:在运行时尝试对象时,操作只需要对象.在编译步骤中,编译器为整个地方的相应对象创建空格和槽 - 并且,在不符合的类型上,会中断编译.
Python的类型检查允许任意数量的工具完全执行以下操作:在实际运行应用程序之前的步骤中进行分解和警告(但独立于编译本身).但是语言的性质无法改变,实际上要求对象在运行时遵守 - 并且在编译步骤本身的打字和破坏非常复杂.
虽然可以预期Python的未来版本可能会在Python运行时本身上进行编译时类型检查 - 最有可能通过和可选的命令行切换.(我认为它不会默认 - 至少不会打破构建 - 也许它可以默认发出警告)
因此,Python在运行时不需要静态类型检查,因为它将不再是Python.但至少有一种语言可以同时使用动态对象和静态类型 - Cython语言,它实际上可以作为Python超集.人们应该期望Cython很快将新的类型提示语法合并为实际的类型声明.(目前它对可选的静态类型变量使用不同的语法)