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()

详细更新说明查看发布公告。