ruff check 不忽略 pyproject.toml 中的 format 配置,但默认不启用格式化;它仅执行 lint 并响应 fix 相关规则,而 ruff format 才读取 [tool.ruff.format] 下的配置(如 quote-style、line-ending)并执行格式化。

ruff check 会忽略 pyproject.toml 里的 format 配置?
不会忽略,但默认不启用格式化——ruff check 只做 lint,ruff format 才管格式。很多人以为加了 format = true 在 [tool.ruff] 下就能让 check 自动格式,其实没这回事。
常见错误现象:ruff check --fix 修了缩进、未使用变量,但没动字符串引号或行尾空格;你改了 quote-style = "single" 却发现双引号还是原样。
-
ruff check只响应fix = true和select类 lint 规则(如ISC001,UP032) -
ruff format才读[tool.ruff.format]下的配置,比如quote-style、indent-style、line-ending - 想一次跑完 lint + format,得显式组合命令,不是靠配置自动联动
怎么安全地把 ruff check 和 format 串成一步?
别用 && 简单拼接,容易漏掉 format 的失败信号。真实项目里,格式化失败(比如文件权限问题、编码异常)不该被 check 成功掩盖。
推荐用 shell 函数或 Makefile 封装,确保两个命令都成功才返回 0:
立即学习“Python免费学习笔记(深入)”;
ruff-check-format() {
ruff check --fix "$@" && ruff format "$@"
}使用场景:CI 脚本、pre-commit、本地一键修复
- 加
--exit-non-zero-on-fix到ruff check,能让有修改时也返回非零(方便 CI 判断是否需提交) -
ruff format默认不检查语法,若文件本身有语法错误,它会跳过并报 warning,但不中断——这不是 bug,是设计如此 - 如果用 pre-commit,直接配
rev: v0.6.0+ 两个 hooks:ruff-pre-commit(对应 check)和ruff-format(对应 format),更稳
pyproject.toml 里 format 相关配置写在哪?
必须写在 [tool.ruff.format] 表下,不是 [tool.ruff]。写错位置等于没配,ruff 会静默忽略。
典型易错点:line-ending 设成 "crlf" 在 macOS/Linux 上不会报错,但实际不生效(ruff 目前只支持 "lf" 和 "native");skip-magic-trailing-comma 默认 false,但启用了 pyink 风格后,它会影响括号换行行为。
-
quote-style = "single":只影响新格式化的字符串,已有双引号不会被ruff format改(除非加--unsafe-fixes,但该 flag 不稳定,慎用) -
indent-style = "space"和indent-width = 4是独立配置项,缺一不可 -
skip = ["migrations/"]在 format 表里才生效;lint 的 skip 要写在[tool.ruff]的exclude或extend-exclude里
为什么 ruff format 后 git diff 还有大量改动?
大概率是 line ending 或 trailing whitespace 没对齐,尤其在跨平台协作时。ruff 默认按系统 native 处理换行,但 Git 通常强制 lf,导致 Windows 用户本地看到一堆 CRLF → LF 变更。
性能影响不大,但干扰 code review。根本解法不是关 format,而是统一源头:
- 在项目根目录加
.gitattributes,写* text=auto eol=lf - 设
line-ending = "lf"在[tool.ruff.format],比"native"更可控 -
ruff format不处理.ipynb,如果 notebook 里嵌了 Python cell,得单独用jupyter nbconvert --to python提取再格式化
最常被忽略的是:ruff format 不改变注释缩进、不重排 import 排序(那是 isort 的事),别指望它替代整个代码风格流水线。










