pre-commit 里 flake8(再加一串插件)、isort、Black 并排挂着。本地保存触发一轮,CI 再跑一轮,配置文件还要互相迁就行宽和 import 分组。Ruff 首页 写自己是 linter + formatter,目标是在同一接口后面收拢更多规则,并且明显更快。FAQ 专门有一节 Which tools does Ruff replace,适合用来决定「先卸哪一层」,而不是听说能替就全砍。
官方明确能对上的几层
FAQ 的替换清单可以概括成三块:
- Linter 侧:在「插件不多、配合 Black、面向 Python 3」这类条件下,可作 Flake8 的 drop-in。并原生重实现大批常见 Flake8 插件(bugbear、comprehensions、simplify 等一长串,具体名单以 FAQ 当日列表为准)
- Import:可替代 isort(FAQ 另有与 isort 的差异说明,整体按接近 Black profile 来设计)
- Formatter:Ruff formatter 定位成 Black 的 drop-in。在已按 Black 格式化过的大项目上,绝大多数行会保持一致
首页也写了:Ruff 可用来替换 Flake8(加大量插件)、Black、isort、pydocstyle、pyupgrade、autoflake 等。FAQ 补充:linter 与 formatter 可以分开用——只用法、只用 lint,或两个都上,官方都允许。规则前缀不一定跟旧插件一模一样,例如 tidy-imports 一类在 Ruff 里可能换成另一组代号,迁配置时要对着规则表,而不是只改可执行文件名。
先替哪一层比较稳
常见迁法不是一天拆光:
- 先上
ruff check,对齐原来 flake8 + 常用插件打开的规则前缀,确认 CI 噪声可接受,再撤 flake8 插件链。 - import 排序若只靠 isort,可打开 Ruff 的 isort 规则组(文档常用
I一类),观察与现有 isort 配置的差异后再撤 isort。 - 格式化最后动:团队已经全员 Black 时,可先继续 Black,只让 Ruff 做 lint。或按 FAQ 把 formatter 切到
ruff format,接受边缘注释等处可能有少量差异。
FAQ 强调:Ruff 不是类型检查器。mypy、Pyright、ty、Pyre 那一层仍要单独留着。Ruff 能抓未使用导入一类问题,抓不住「把 int 传进要 str 的参数」这类类型错误。类型检查器反过来也不替代 lint。Pylint 也不是纯替换关系:规则集合有交集也有互不覆盖的部分,FAQ 写得很直。别把「上了 Ruff」理解成「类型检查也可以卸了」。
安装和日常命令
FAQ 推荐用 uv 装工具,例如:
uv tool install ruff@latest
# 或进项目开发依赖
uv add --dev ruff
也可用 pip / pipx,以及独立安装脚本。装好后常用:
ruff check .
ruff check . --fix
ruff format .
配置可放 pyproject.toml 的 [tool.ruff],或单独的 ruff.toml。行宽要和原来的 Black / flake8 约定对齐,否则 E501 和格式化会打架。FAQ 对 line-length 与 Black / Ruff formatter 的关系有专门说明。想看某个文件实际吃到的配置,可用 ruff check 路径 --show-settings。自动修复分安全 / 不安全两类,默认只动安全修复。需要更激进时再开 FAQ 里说的 unsafe 相关开关,并自己审 diff。
别期待的边界
- 不支持自定义 Flake8 插件那套第三方规则扩展(流行插件多半已在 Rust 侧重写进 Ruff)
- 与 isort 在个别别名导入、行内注释上可能有细微差别
- 「必须弃用一切旧工具」不是官方口径。能替换的列表以 FAQ 当日为准,列表外的插件先保留或提需求
- Jupyter 笔记本有单独说明。笔记本上的 organize imports / fixAll 一类动作,FAQ 提醒要用 notebook 前缀的 code action,避免并行修单元格时行为怪异
pre-commit 里若同时留着旧 hook 和新 hook,记得别让 Black 和 ruff format 抢同一批文件,也别让 flake8 与 ruff check 对同一规则报两遍。CI 日志里最先该看的是「谁还在跑」,不是「谁更快」。
规则默认集不一定覆盖你们旧 flake8 配置里打开的全部代号,迁过去后应用 --select / ignore 对照一周 CI,再谈删旧配置文件。
你们是先把 flake8 插件链收进 ruff check,还是连 Black 一起换成 ruff format?规则集 select 怎么收的,欢迎贴一份精简配置。