Python 的类型检查生态系统长期以来由 mypy 主导——它是率先为 Python 引入渐进类型的类型检查器。但 mypy 基于 Python 的实现一直在大型代码库的性能上苦苦挣扎。Ty 是 Astral 对这个问题的解答:一个完全用 Rust 编写的 Python 类型检查器和语言服务器,设计上比现有替代方案快 10 到 60 倍。
Astral,也就是广受欢迎的 Ruff 检查器背后的公司,将同样的 Rust 驱动性能哲学应用到了类型检查领域。Ty 建立在 Astral 在 Rust 中处理 Python 工具的深厚经验之上,利用了使 Ruff 成为 Python 检查业界标准的相同多线程架构和增量计算模式。
数字说明了一切。在拥有数十万行 Python 代码的大型单仓库中,Ty 在几秒钟内完成初始类型检查,而不是几分钟。文件变更后的增量检查几乎是即时的,使得即使在最大的项目中,也能在每次保存文件时执行类型检查。对于那些忍受了 mypy 数分钟检查时间的开发者来说,Ty 代表了开发体验的变革性改进。
Ty 如何实现如此戏剧性的速度提升?
Ty 的性能优势来自架构决策和实现选择的组合,而非任何单一优化。
graph LR
A[Python 源文件] --> B[并行文件发现]
B --> C[用 Rust 进行 AST 解析]
C --> D[Salsa 增量引擎]
D --> E{缓存命中?}
E -->|是| F[重用缓存的类型信息]
E -->|否| G[类型推断与检查]
G --> H[存储在增量数据库中]
F --> I[收集诊断信息]
H --> I
I --> J[输出结果]
基于 Salsa 的增量计算引擎是 Ty 性能的关键。它以细粒度追踪文件和类型定义之间的依赖关系。当文件变更时,只有依赖于变更部分的计算会被重新执行,而不是重新检查整个项目。这与 Rust 编译器的增量编译系统使用了相同的方法。
Ty 与其他 Python 类型检查器相比如何?
Python 类型检查领域有几个成熟的参与者,各有不同的性能特性和功能集。
| 功能 | Ty | mypy | pyright | pyre | pytype |
|---|---|---|---|---|---|
| 语言 | Rust | Python | TypeScript | OCaml | Python |
| 速度 | 快 10-60 倍 | 基准线 | 比 mypy 快 5-10 倍 | 中等 | 慢 |
| LSP 服务器 | 内置 | 分离 | 内置 | 分离 | 分离 |
| PEP 695 支持 | 是 | 部分 | 部分 | 否 | 否 |
| 插件系统 | 计划中 | 广泛 | 有限 | 最少 | 最少 |
| 单仓库支持 | 原生 | 通过配置 | 通过配置 | 原生 | 基本 |
| 配置 | pyproject.toml | mypy.ini、setup.cfg | pyproject.toml | 自定义配置 | setup.cfg |
Ty 在 Rust 中的全新设计使其能够采用最新的 Python 类型系统功能,而不受遗留兼容性限制的束缚。其内置的 LSP 服务器消除了单独设置语言服务器的需求,提供了统一的工具链体验。
Ty 支持哪些类型系统功能?
Ty 目标是全面涵盖 Python 不断演进类型系统,包括既有和新兴的功能。
| 功能 | 状态 | PEP 参考 |
|---|---|---|
| 基本类型注解 | 完成 | PEP 484 |
| 泛型类型 | 完成 | PEP 484、PEP 695 |
| 联合类型 (X | Y) | 完成 | PEP 604 |
| Protocols(结构子类型) | 完成 | PEP 544 |
| TypedDict | 完成 | PEP 589 |
| Literal 类型 | 完成 | PEP 586 |
| TypeVarTuple / ParamSpec | 完成 | PEP 646、PEP 612 |
| 类型缩小 | 完成 | – |
| 重载装饰器 | 完成 | PEP 484 |
| Self 类型 | 完成 | PEP 673 |
| TypeIs(类型缩小) | 完成 | PEP 742 |
| TypedDict 替代方案 | 完成 | PEP 728 |
| Python 3.14 类型功能 | 计划中 | 最新 PEP |
Ty 紧密追踪最新的 PEP 发展,目标是在新类型功能被接受后不久即提供支持。这种快速采用周期确保使用最新 Python 版本的项目能够在类型检查器的完整支持下受益于现代类型系统功能。
Ty 如何与编辑器工作流程集成?
Ty 的内置 LSP 服务器在所有主要编辑器和 IDE 中提供无缝的开发体验。
| 编辑器/IDE | 集成方式 | 主要 LSP 功能 |
|---|---|---|
| VS Code | LSP 扩展 | 实时诊断、自动完成 |
| Neovim | 内置 LSP 客户端 | 内联错误、悬停、跳转到定义 |
| JetBrains | LSP 插件 | 完整 IDE 集成 |
| Helix | 内置 LSP | 自动设置 |
| Sublime Text | LSP 插件 | 诊断、自动完成 |
| Emacs | eglot/lsp-mode | 完整 LSP 支持 |
LSP 服务器在您输入时提供实时诊断、尊重类型限制的自动完成、具有类型感知导航的跳转到定义和查找引用、包含推断类型的悬停信息,以及附带建议修复的内联错误消息。
FAQ
什么是 Ty? Ty 是 Astral 用 Rust 编写的 Python 类型检查器和语言服务器,设计上比 mypy 和 pyright 等现有工具快 10-60 倍。它提供实时类型检查与 IDE 集成。
Ty 相较于 mypy 如何达到如此快的速度? Ty 使用 Rust 编写,采用多线程架构,包含增量编译、AST 缓存和并行文件分析。它使用基于 Salsa 的增量计算模型独立处理文件。
Ty 是否完整支持 Python 类型注解? Ty 目标是近乎完整地支持 Python 类型系统,包括泛型、重载、Protocols、TypedDicts、Literal 类型以及最新的 PEP 规范。它追踪 PEP 695(类型参数语法)及后续标准。
Ty 能否在现有项目中取代 mypy? 可以,Ty 设计为直接替代品。它支持 mypy 兼容的配置,可以集成到现有的 CI/CD 管道和编辑器工作流程中。许多项目只需更改类型检查命令即可切换。
Ty 是否包含语言服务器协议实现? 是的,Ty 包含一个内置的 LSP 服务器,可在任何兼容 LSP 的编辑器中提供实时类型检查、自动完成、跳转到定义、查找引用、悬停信息和内联错误诊断。
延伸阅读
- Ty GitHub 仓库 – 源代码、问题和文档
- Ruff (Astral 的 Python 检查器) – Ty 的兄弟项目,提供极速检查
- Mypy 官方文档 – 原始的 Python 类型检查器,供比较参考
- Python 类型检查指南 – 官方 Python 类型文档
- Salsa 增量计算框架 – 驱动 Ty 增量引擎的 Rust 框架
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!