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助你行銷加分!