lang
lang/python/tooling/ruff-lint-format.md
medium
py-ruff-lint-format
Ruff 一统 lint+format,取代 flake8/black/isort/pylint/pyupgrade。Use when 配置 linter / 配置 formatter / 整理 import / 自动修复风格问题。
rufflint格式化formatterisort
paths
*.pypy/**/*.py
Python · Ruff 一统 lint 与 format
规则
| 规则 | 说明 |
|---|---|
| 一个工具替全套 | ruff 同时做 lint + format,替掉 flake8/black/isort/pylint/pyupgrade |
配置写进 pyproject.toml |
用 [tool.ruff],不再维护 .flake8/setup.cfg |
| 显式选规则集 | select 列出启用的规则前缀,别只靠默认 |
修复用 --fix |
ruff check --fix 自动修,剩下手动处理 |
| format 与 lint 分开 | ruff format 排版,ruff check 查错,二者互补 |
| 第三方代码用 import 排序 | I 规则替代 isort,无需单独配置 |
正例
pyproject.toml:
[tool.ruff]
line-length = 100
target-version = "py312"
src = ["src", "tests"]
[tool.ruff.lint]
# E/F=pyflakes+pycodestyle, I=isort, UP=pyupgrade,
# B=bugbear, SIM=simplify, RUF=ruff 专属
select = ["E", "F", "I", "UP", "B", "SIM", "RUF"]
ignore = ["E501"] # 行宽交给 formatter,lint 不重复报
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["S101"] # 测试里允许 assert
[tool.ruff.format]
quote-style = "double"
常用命令:
ruff check --fix . # lint + 自动修
ruff format . # 排版
ruff check --diff . # CI 里只看差异,不改盘
反例
# ❌ 同时装 black + isort + flake8 + ruff,规则互相打架
# → 只留 ruff,删掉 .flake8 / .isort.cfg
# ❌ 不写 select,默认只开 E/F,漏掉 import 排序和升级建议
[tool.ruff.lint]
# select 缺失 → I/UP/B 规则不生效
# ❌ lint 报行宽又让 formatter 排版,两边冲突反复跳动
[tool.ruff.lint]
select = ["E"] # E501 未 ignore,与 formatter 抢行宽
# ❌ CI 里用 --fix 改动工作区,掩盖问题
ruff check --fix . # CI 应只检测:去掉 --fix,加 --diff 或不加
自检
- [ ] 配置在
pyproject.toml的[tool.ruff],没有残留.flake8/setup.cfg? - [ ]
select显式列出了规则集(至少 E/F/I)? - [ ] 项目里已移除 black/isort/flake8,避免与 ruff 冲突?
- [ ] CI 用
ruff check(不带--fix),本地才用--fix? - [ ]
ruff format与ruff check分别在脚本里调用?