python - 如何在 python 3.6 中使用类型提示?

标签 python python-3.x type-hinting mypy python-typing

我注意到 Python 3.5 和 Python 3.6 添加了很多关于静态类型检查的功能,所以我尝试使用以下代码(在 python 3.6 中,稳定版本)。

from typing import List

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

令我惊讶的是,Python 没有给我错误或警告,尽管 1 被附加到一个只应包含字符串的 list 中。 Pycharm 检测到类型错误并给了我一个警告,但它并不明显,也没有显示在输出控制台中,我担心有时我可能会错过它。我想要以下效果:

  1. 如果很明显我使用了错误的类型,如上所示,抛出警告或错误。
  2. 如果编译器无法可靠地检查我使用的类型是对还是错,请忽略它。

这可能吗?也许 mypy 可以做到,但我更愿意使用 Python-3.6 风格的类型检查(如 a: List[str])而不是注释风格 (就像在 mypy 中使用的 # type List[str]) 一样。而且我很好奇在原生python 3.6中是否有一个开关来实现我上面说的两点。

最佳答案

类型提示完全被 Python 运行时忽略,并且仅由 mypy 和 Pycharm 的集成检查器等第 3 方工具检查。还有各种鲜为人知的第 3 方工具使用类型注释在编译时或运行时进行类型检查,但大多数人使用 mypy 或 Pycharm 的集成检查器 AFAIK。

事实上,我怀疑在可预见的 future 类型检查是否会被集成到 Python 中——参见 PEP 484 的“非目标”部分(引入了类型注释)和 PEP 526 (其中引入了变量注解),以及Guido的评论here .

我个人很乐意将类型检查与 Python 更紧密地集成在一起,但似乎整个 Python 社区都没有准备好或愿意接受这样的改变。

最新版本的 mypy 应该能理解 Python 3.6 变量注释语法和注释式语法。事实上,变量注释基本上是 Guido 的想法(Guido 目前是 mypy 团队的一员)——基本上,mypy 和 Python 中对类型注释的支持几乎是同时开发的。

关于python - 如何在 python 3.6 中使用类型提示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623839/

相关文章:

python - Statsmodels:从 VARMAX.fit() 获取误差相关矩阵

python - 如何在Keras中使用reset_states(states)函数?

python - 如何将未知时区的字符串datetime转换为python中的时间戳

python-3.x - 使用 Python Selenium 运行循环

python - Typing.NamedTuple 和可变默认参数

python - 神经网络 - 类型错误 : can't multiply sequence by non-int of type 'float'

python - 使用 Python 和正则表达式在字符串中查找 C 关键字

python-3.x - 如何使用自定义身份验证使用docker设置pypiserver?

python - 使用 Mypy 本地 stub

c++ - 如何禁用 Dev C++ 中的提示?