ty: Astral(Ruff 与 uv 的创作者)推出的闪电般快速的 Python 类型检查器
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文并保留原有的格式。
关键特性
- ⚡ 闪电般快速 – 比 mypy 和 Pyright 快 10–100 倍
- 🔍 丰富的诊断信息 – 带有多文件上下文的详细错误信息
- 🧠 智能类型推断 – 即使没有类型注解也能捕获错误
- 🎯 高级类型系统 – 交叉类型、先进的类型收窄、可达性分析
- 🛠️ 语言服务器 – 内置 IDE 集成支持(提供 VS Code 扩展)
安装
# Using uv (recommended)
uv tool install ty@latest
# Using pip
pip install ty
基本用法
# Check a file
ty check file.py
# Check directories
ty check src tests
# Verbose mode
ty check src --verbose
什么让 ty 与众不同?
1. 关键的速度
ty 能在 约 2.19 秒 内完成对整个 Home Assistant 项目的类型检查,而 mypy 需要 45.66 秒——快 20 倍以上!
对于大型代码库,这种速度差异会彻底改变开发者的体验:
- 再也不需要等待 CI 完成
- 在 IDE 中即时获得反馈
- 完全可以在每次保存时运行
2. 强大的类型推断
ty 即使在没有类型注解的情况下也能发现 bug。下面是一些真实案例。
真实的 Bug 检测
示例 1:类型不匹配
def add(x: int, y: int) -> int:
return x + y
result: str = add(1, 2) # Oops! Assigning int to str
ty 的输出
error[invalid-assignment]: Object of type `int` is not assignable to `str`
--> example.py:4:9
|
4 | result: str = add(1, 2)
| --- ^^^^^^^^^ Incompatible value of type `int`
| |
| Declared type
示例 2:缺失属性
class User:
def __init__(self, name: str):
self.name = name
def get_email(self):
return self.email # email was never defined!
ty 捕获到此问题
error[unresolved-attribute]: Object of type `Self@get_email` has no attribute `email`
--> example.py:6:16
|
6 | return self.email
| ^^^^^^^^^^
即使是更复杂的情况:
class DatabaseClient:
def __init__(self, connection_string: str):
self.connection = connect(connection_string)
def query(self, sql: str):
# Typo: should be .execute(), not .exec()
return self.connection.exec(sql)
ty 会提示 .exec() 在该连接对象上不存在。
示例 3:函数参数错误
numbers: list[int] = [1, 2, 3]
numbers.append("four") # String in int list!
ty 的错误信息
error[invalid-argument-type]: Argument to bound method `append` is incorrect
--> example.py:2:16
|
2 | numbers.append("four")
| ^^^^^^ Expected `int`, found `Literal["four"]`
示例 4:空安全(Null Safety)
def process(value: str | None) -> int:
return len(value) # What if value is None?
ty 发现问题
error[invalid-argument-type]: Expected `Sized`, found `str | None`
--> example.py:2:16
|
2 | return len(value)
| ^^^^^
|
info: Element `None` of this union is not assignable to `Sized`
示例 5:隐式 None 返回
def get_name(user_id: int) -> str:
if user_id > 0:
return "User"
# Missing return statement – implicit None!
ty 同样捕获到
error[invalid-return-type]: Function can implicitly return `None`,
which is not assignable to return type `str`
配置
ty 使用 pyproject.toml 进行配置:
[tool.ty]
[tool.ty.environment]
python-version = "3.10"
[tool.ty.src]
include = ["src/**/*.py", "tests/**/*.py"]
exclude = [".tox/**", "build/**", "dist/**"]
# Per‑directory overrides
[[tool.ty.overrides]]
include = ["tests/**/*.py"]
[tool.ty.overrides.rules]
invalid-assignment = "ignore" # More lenient for tests
CI/CD 集成
GitHub Actions
name: Type Check
on: [push, pull_request]
jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
run: pip install ty
- name: Run type checker
run: ty check src tests
tox 集成
[testenv:ty]
deps =
ty
-e .
commands =
ty check src tests
pre‑commit Hook
repos:
- repo: local
hooks:
- id: ty
name: ty type checker
entry: ty check src tests
language: system
pass_filenames: false
types: [python]
尽情享受 ty 为您的 Python 项目带来的速度与安全性!
编辑器集成
VS Code
- 从 VS Code Marketplace 安装 “ty” 扩展。
享受自动化功能:
- 实时类型检查
- 推断类型的内嵌提示
- 代码操作和快速修复
- 带类型感知的跳转到定义
ty vs mypy vs Pyright
| 功能 | ty | mypy | Pyright |
|---|---|---|---|
| 速度 | ⚡⚡⚡ 超快 | 🐢 中等 | 🚀 快速 |
| 语言 | Rust | Python | TypeScript |
| 错误信息 | 📝 非常详细 | 📄 标准 | 📝 详细 |
| 类型推断 | 🧠 强大 | 📚 标准 | 🧠 强大 |
| 成熟度 | 🆕 测试版 | ✅ 稳定 | ✅ 稳定 |
| 诊断 | 🔍 多文件上下文 | 📊 单文件 | 🔍 跨文件 |
| 语言服务器 | ✅ 内置 | ⚠️ 通过 dmypy | ✅ 内置 |
当前限制
As of v0.0.9 (Beta):
- 受限的规则集 – 已实现主要规则;更多将在 2026 年推出。
- 尚未支持严格模式 – 不会对缺失的类型注解提出警告。
- Beta 状态 – API 可能在正式版发布前更改。
即使在 beta 阶段,ty 已经能够捕获真实的 bug,并在生产代码库中提供价值。
开始使用 ty
步骤 1:安装并运行
uv tool install ty@latest
ty check src
步骤 2:查看结果
ty 将向您展示代码中的实际错误,即使没有类型注解!
步骤 3:添加到 CI
# Add to your test script
tox -e ty
# Or run directly
ty check src tests
步骤 4:逐步添加类型注解
# Before
def calculate_total(items):
return sum(item.price for item in items)
# After
def calculate_total(items: list[Item]) -> Decimal:
return sum(item.price for item in items)
有了注解,ty 将变得更加强大!
实际案例:FastAPI 应用
from fastapi import FastAPI, HTTPException
app = FastAPI()
class UserService:
def __init__(self, db_url: str):
self.db = connect_database(db_url)
def get_user(self, user_id: int):
user = self.db.query(User).filter(User.id == user_id).first()
if user:
return user
# Bug: FastAPI expects HTTPException, but we're returning None!
return None
@app.get("/users/{user_id}")
async def get_user(user_id: int):
service = UserService(DB_URL)
user = service.get_user(user_id)
# Bug: user could be None, but we're accessing .dict()
return user.dict()
ty 将捕获这两个错误:
get_user可能返回None,但 FastAPI 期望抛出异常或返回有效的用户对象。- 如果
user为None,调用user.dict()将导致错误。
性能提示
- 使用文件排除 – 跳过生成的文件和 vendor 目录。
- 启用缓存 –
ty为未更改的文件缓存结果。 - 并行处理 –
ty自动使用多核。 - 增量模式 – 在编辑器中,仅重新检查已更改的文件。
路线图
根据 Astral,ty 计划在 2026 年推出稳定的 1.0 版本,计划包括:
- ✅ 更全面的规则覆盖
- ✅ 严格模式(强制类型注解)
- ✅ 更好地与流行框架集成
- ✅ 用于自定义规则的插件系统
- ✅ 性能优化
结论
ty 代表了 Python 类型检查的下一步演进。它结合了极快的速度、强大的推断能力和出色的诊断功能,使其成为 Python 开发者的有力选择。
虽然仍处于 beta 阶段,ty 已经在捕获真实错误和提升代码质量方面展现出价值。如果你正在使用 mypy 或 Pyright 并且对缓慢的检查时间感到沮丧,ty 值得一试。
Astral 团队在 Ruff 和 uv 上拥有出色的业绩记录,ty 看起来将成为 Python 工具生态系统中的又一颠覆性产品。
资源
- 🌐 官方网站:
- 📚 文档:
- 💻 GitHub:
- 💬 Discord:
你尝试过 ty 吗?你对 Python 类型检查器的使用体验如何?请在评论中告诉我! 👇