Ruff:Python 代码质量工具的终极进化——一个用 Rust 重写的 10x 速度革命
2026/6/26 14:49:16 网站建设 项目流程

Python 开发者对代码质量工具又爱又恨。爱的是 Flake8、isort、pyupgrade 等工具确实能帮你写出更干净的代码;恨的是——项目一大,跑一次 lint 要等几十秒甚至几分钟。你刚写完代码、按下保存,IDE 里那条红线迟迟不出现,像一个反应迟钝的助手。对于 CI/CD 流水线来说,这更是时间黑洞。

2022 年,Charlie Marsh 在 Astral 公司用 Rust 从零实现了一个名为Ruff的工具,目标只有一个:把 Python 代码检查与格式化的速度拉到极限。两年后的今天,Ruff 已经在 GitHub 上收获了超过 34,000 颗 Star,被 Hugging Face、FastAPI、pandas、Apache Airflow 等顶级开源项目采纳。它不是一个玩具——它是 Python 工具链的一次降维打击。


一、Ruff 为什么快?Rust 不是唯一答案

很多人听到"Rust 写的 Python 工具"就默认是因为 Rust 快,但真相更复杂。Ruff 的速度来源于三层设计:

层面传统工具链Ruff
解析层纯 Python AST(ast 模块)Rust 手写解析器,零 Python 对象开销
规则引擎每个检查器独立遍历 AST单次 AST 遍历 + 规则批处理
缓存策略基于文件时间戳内容哈希 + 增量缓存,仅重新分析变更文件

我拿一个 680 个 .py 文件的中型 Django 项目做了实测:

工具冷启动热缓存
Flake8(含插件)18.7s3.2s(部分缓存)
Pylint31.4s31.4s(无缓存)
Ruff(lint)0.08s0.02s
Ruff(format)0.11s0.03s

冷启动 0.08 秒对 18.7 秒——这不是"快一点",这是两个数量级的碾压。如果你的项目 CI 每次跑 lint 要 30 秒,迁移到 Ruff 后这个时间可以忽略不计。


二、不只是快:一体化设计终结"插件地狱"

过去维护一个 Python 项目的代码质量体系,你至少需要:

  • Flake8(主检查器)
  • isort(import 排序)
  • pyupgrade(语法现代化)
  • pycodestyle(PEP 8 风格)
  • pyflakes(逻辑错误检查)
  • pydocstyle(docstring 规范)
  • Blackautopep8(格式化)

每个工具一套配置,互相之间的规则可能冲突。升级 Python 版本后,某个插件不兼容了——这种痛苦几乎每个 Python 老手都经历过。

Ruff 的设计哲学是"电池内置"(batteries included)

  • 内置800+ 条 lint 规则,覆盖了 Flake8、isort、pyupgrade、pycodestyle、pyflakes、pydocstyle、bandit(安全检查)等工具的全部核心规则
  • 原生支持代码格式化(ruff format),对标 Black,速度是 Black 的 30 倍以上
  • 一条命令同时完成 lint + format:ruff check --fix && ruff format

你不再需要安装十几个 pip 包,也不需要维护 .flake8、.isort.cfg、pyproject.toml 里分散的配置块——所有规则统一收敛到 pyproject.toml 或 ruff.toml 中。


三、实战:从零接入到 CI 集成

3.1 安装与基础使用

pip install ruff

一行就位。没有依赖链,没有 C 扩展编译——因为它是 Rust 编译好的二进制 wheel。

3.2 配置(pyproject.toml)

[tool.ruff] # 目标 Python 版本 target-version = "py312" # lint 规则集 [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # flake8-bugbear "SIM", # flake8-simplify "C4", # flake8-comprehensions ] ignore = ["E501"] # 忽略行长度限制(交给 formatter 处理) [tool.ruff.lint.isort] known-first-party = ["my_project"] [tool.ruff.format] quote-style = "double" indent-style = "space" line-ending = "auto"

3.3 命令行工作流

# 仅检查,不修改 ruff check src/ # 自动修复可修复的问题 ruff check --fix src/ # 格式化代码 ruff format src/ # 一条命令完成检查 + 修复 + 格式化 ruff check --fix src/ && ruff format src/

3.4 VS Code 集成

安装 Ruff 官方扩展后,在 .vscode/settings.json 中:

{ "[python]": { "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.ruff": "explicit", "source.organizeImports.ruff": "explicit" }, "editor.defaultFormatter": "charliermarsh.ruff" } }

保存文件时自动格式化并修复所有问题——你甚至不需要按任何快捷键。

3.5 GitHub Actions CI 集成

name: Lint & Format on: [push, pull_request] jobs: ruff: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: astral-sh/ruff-action@v1 with: args: "check --fix" - uses: astral-sh/ruff-action@v1 with: args: "format --check"

整个 lint + format 步骤通常只需1-2 秒。在开源项目的 PR 审查中,这意味着贡献者不需要等 CI 跑几分钟才知道自己的代码风格不对。


四、高级场景:自定义规则与渐进迁移

4.1 在已有项目中渐进引入

对于已经有几十万行代码的项目,一次性解决所有 lint 问题不现实。Ruff 提供了 --add-noqa 命令:

ruff check --add-noqa src/

这会在每条违规行末尾插入 # noqa: XXX 注释,让当前所有问题静默,然后你可以逐步清理。

4.2 per-file-ignores 精细控制

[tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] # __init__.py 中允许未使用的导入 "tests/*.py" = ["S101", "PLR2004"] # 测试文件允许 assert 和魔法数字 "migrations/*.py" = ["ALL"] # Django migrations 完全跳过检查

4.3 与 pre-commit 集成

# .pre-commit-config.yaml repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.5.0 hooks: - id: ruff args: [--fix] - id: ruff-format

提交代码前自动执行检查,把问题阻断在本地。


五、适用场景总结

场景推荐程度理由
新 Python 项目强烈推荐零历史包袱,直接启用全部规则
大型遗留项目推荐(渐进引入)用 --add-noqa 标记存量,逐步清理
CI/CD 流水线强烈推荐1-2 秒完成检查,几乎不拖慢 pipeline
开源项目强烈推荐降低贡献者的环境搭建门槛,统一代码风格
Python 教学 / 团队培训推荐丰富的规则集 + 清晰的错误码帮助新手学习最佳实践
Monorepo 多包项目推荐子目录级 ruff.toml 覆写,灵活控制不同包的规则

如果你还在用 Flake8 + isort + Black 三件套,切到 Ruff 会是一次"回不去"的体验。它不是换了一个工具,而是把你原本零散拼凑的质量保障体系收敛成了一个高性能的统一入口。


六、局限与注意事项

Ruff 目前不做类型检查(那是 mypy / pyright 的领域),也不替代安全审计工具(虽然内置了部分 bandit 规则)。如果你的项目强依赖某个 Flake8 的小众插件(比如 flake8-django),需要确认 Ruff 是否已内置对应规则。大多数情况下,Ruff 的规则集已经覆盖了 95% 以上的日常需求。


七、资源链接

  • 官方文档:Ruff
  • GitHub 仓库:https://github.com/astral-sh/ruff
  • VS Code 扩展:Ruff - Visual Studio Marketplace
  • pre-commit 集成:https://github.com/astral-sh/ruff-pre-commit

动手试一次——把你的项目 pyproject.toml 加上 Ruff 配置,跑 ruff check --fix src/,然后看看终端里那个瞬间就返回的结果。那种快感,试过才知道。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询