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

新手上路,请多包涵

我注意到 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] )而不是评论风格(如 # type List[str] ) 用于 mypy 。而且我很好奇原生的python 3.6有没有switch来实现我上面说的两点。

原文由 Searene 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 774
2 个回答

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

Python 不可能为你做这件事;您 可以 使用 mypy 进行类型检查(PyCharms 内置检查器也应该这样做)。除此之外, mypy 也不限制 您只能输入注释 # type List[str] ,您可以像在 Python 3.6 中那样使用变量注释,因此 a: List[str] 有效同样好。

With mypy as is, because the release is fresh, you’ll need to install typed_ast and execute mypy with --fast-parser and --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)

使用上述参数运行 mypy (您必须首先 pip install -U typed_ast ):

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

捕获错误:

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

正如 在使用 Python 进行类型提示的许多其他答案中 所述, mypyPyCharm 执行验证的是类型检查器, _而不是 Python 本身_。 Python 目前不使用此信息,它仅将其存储为元数据并在执行期间忽略它。

原文由 Dimitris Fasarakis Hilliard 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

事实上,我真的怀疑在可预见的未来类型检查是否会被集成到 Python 中——参见 PEP 484 (引入类型注释)和 PEP 526 (引入变量注释)的“非目标”部分,以及正如 Guido 在这里 的评论。

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

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

原文由 Michael0x2a 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题