ty: Astral(Ruff 与 uv 的创作者)推出的闪电般快速的 Python 类型检查器

发布: (2026年1月7日 GMT+8 12:44)
8 min read
原文: Dev.to

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

功能tymypyPyright
速度⚡⚡⚡ 超快🐢 中等🚀 快速
语言RustPythonTypeScript
错误信息📝 非常详细📄 标准📝 详细
类型推断🧠 强大📚 标准🧠 强大
成熟度🆕 测试版✅ 稳定✅ 稳定
诊断🔍 多文件上下文📊 单文件🔍 跨文件
语言服务器✅ 内置⚠️ 通过 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 将捕获这两个错误:

  1. get_user 可能返回 None,但 FastAPI 期望抛出异常或返回有效的用户对象。
  2. 如果 userNone,调用 user.dict() 将导致错误。

性能提示

  • 使用文件排除 – 跳过生成的文件和 vendor 目录。
  • 启用缓存ty 为未更改的文件缓存结果。
  • 并行处理ty 自动使用多核。
  • 增量模式 – 在编辑器中,仅重新检查已更改的文件。

路线图

根据 Astral,ty 计划在 2026 年推出稳定的 1.0 版本,计划包括:

  • ✅ 更全面的规则覆盖
  • ✅ 严格模式(强制类型注解)
  • ✅ 更好地与流行框架集成
  • ✅ 用于自定义规则的插件系统
  • ✅ 性能优化

结论

ty 代表了 Python 类型检查的下一步演进。它结合了极快的速度、强大的推断能力和出色的诊断功能,使其成为 Python 开发者的有力选择。

虽然仍处于 beta 阶段,ty 已经在捕获真实错误和提升代码质量方面展现出价值。如果你正在使用 mypyPyright 并且对缓慢的检查时间感到沮丧,ty 值得一试。

Astral 团队在 Ruffuv 上拥有出色的业绩记录,ty 看起来将成为 Python 工具生态系统中的又一颠覆性产品。

资源

  • 🌐 官方网站:
  • 📚 文档:
  • 💻 GitHub:
  • 💬 Discord:

你尝试过 ty 吗?你对 Python 类型检查器的使用体验如何?请在评论中告诉我! 👇

Back to Blog

相关文章

阅读更多 »