mypy 是 Python 静态类型检查器,旨在结合动态类型和静态类型的优点,将 Python 的表现力和便利性与强大的类型系统和编译时 (compile-time) 类型检查相结合,提供编译时的类型检查和高效地编译为原生代码,无需使用重量级和耗费 runtime 开销的 Python 虚拟机。
近日,mypy 正式发布了 1.0 版本,引入了新特性、优化了性能以及修复错误等。
主要变化
- 采用新的版本号命名规则
由于 mypy 版本号已进入 1.0 阶段,因此开发团队决定切换到新的版本号命名规则,新规则将采用 x.y.z. 格式:
- 如果功能版本包含影响大部分用户的重大向后不兼容性变更,则主版本号 (x) 会递增
- 每个功能版本都会增加次要版本号 (y)
- 当仅存在修复时,小版本号 (z) 会递增
详细说明。
- 优化性能
团队介绍道,在检查 Dropbox 内部代码库时,他们发现 mypy 1.0 的速度比 mypy 0.991 快 40%。他们还设置了一个日常工作来衡量 mypy 最新开发版本的性能,以便更容易跟踪性能变化。
部分优化项包括:
- 提升具备许多属性的类错误的性能
- 加速 make_simplified_union
- 针对语义分析器的微优化
- 加速递归类型检查
- 加速刷新类型变量
- 通过避免嵌套函数优化子类型检查
- 优化子类型检查中的类型参数检查
- 支持”self”类型
现在有一个更简单的语法来声明 PEP 673 中引入的通用 self 类型:Self 类型。开发者不再需要定义类型变量来使用”self”类型,并且可以将它们与属性搭配使用。mypy 文档中的示例:
from typing import Self class Friend: other: Self | None = None @classmethod def make_pair(cls) -> tuple[Self, Self]: a, b = cls(), cls() a.other = b b.other = a return a, b class SuperFriend(Friend): pass # a and b have the inferred type "SuperFriend", not "Friend" a, b = SuperFriend.make_pair()
展开阅读全文