# 仓库里 flake8、isort、Black 叠太沉，Ruff 官方说能先替掉哪一层？

**URL:** <https://www.shiqidu.com/t/topic/1972>\
**Category:** 开发调优\
**Tags:** 问与答, Python, 编程, 开源软件\
**Created:** [2026 年11 月 8 日 02:20 UTC](https://www.shiqidu.com/t/topic/1972 "2026-11-08T02:20:05Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

作者： ![shiqidu\_editor](https://www.shiqidu.com/user_avatar/www.shiqidu.com/shiqidu_editor/32/528_2.png) [@shiqidu\_editor](https://www.shiqidu.com/u/shiqidu_editor)\
发布日期： [2026 年11 月 8 日 02:20 UTC](https://www.shiqidu.com/t/topic/1972/1 "2026-11-08T02:20:05Z")

</div>

pre-commit 里 flake8（再加一串插件）、isort、Black 并排挂着。本地保存触发一轮，CI 再跑一轮，配置文件还要互相迁就行宽和 import 分组。[Ruff 首页](https://docs.astral.sh/ruff/) 写自己是 linter + formatter，目标是在同一接口后面收拢更多规则，并且明显更快。[FAQ](https://docs.astral.sh/ruff/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 里可能换成另一组代号，迁配置时要对着规则表，而不是只改可执行文件名。

## 先替哪一层比较稳

常见迁法不是一天拆光：

1. 先上 `ruff check`，对齐原来 flake8 + 常用插件打开的规则前缀，确认 CI 噪声可接受，再撤 flake8 插件链。
2. import 排序若只靠 isort，可打开 Ruff 的 isort 规则组（文档常用 `I` 一类），观察与现有 isort 配置的差异后再撤 isort。
3. 格式化最后动：团队已经全员 Black 时，可先继续 Black，只让 Ruff 做 lint。或按 FAQ 把 formatter 切到 `ruff format`，接受边缘注释等处可能有少量差异。

FAQ 强调：Ruff **不是** 类型检查器。mypy、Pyright、ty、Pyre 那一层仍要单独留着。Ruff 能抓未使用导入一类问题，抓不住「把 int 传进要 str 的参数」这类类型错误。类型检查器反过来也不替代 lint。Pylint 也不是纯替换关系：规则集合有交集也有互不覆盖的部分，FAQ 写得很直。别把「上了 Ruff」理解成「类型检查也可以卸了」。

## 安装和日常命令

FAQ 推荐用 uv 装工具，例如：

```bash
uv tool install ruff@latest
# 或进项目开发依赖
uv add --dev ruff

```

也可用 pip / pipx，以及独立安装脚本。装好后常用：

```bash
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` 怎么收的，欢迎贴一份精简配置。
