Ruff代码检查 — Ruff超快Python linter
一句话概述:Ruff 是用 Rust 写的超快 Python 代码检查和格式化工具,比 Flake8+Black+isort 快 10-100 倍,一个工具替代一堆,是 2026 年 Python 项目的标配。
核心知识点速查表
| 概念 | 白话解释 |
|---|
| Linter | 代码"挑刺员",检查语法错误、风格问题、潜在 bug |
| Formatter | 代码"美化师",统一代码格式(缩进、换行、引号等) |
| Rule(规则) | 每条检查规则有一个编号,比如 E501 表示行太长 |
| Fix(自动修复) | Ruff 可以自动修复很多问题,不需要手动改 |
| pyproject.toml | 配置文件,告诉 Ruff 检查哪些规则、忽略哪些文件 |
当前版本信息(2026年)
| 信息 | 详情 |
|---|
| 最新版本 | Ruff 0.15.12(2026年4月) |
| 开发语言 | Rust(所以特别快) |
| 内置规则 | 800+ 条(覆盖 Flake8 几十个插件) |
| 开发商 | Astral(已加入 OpenAI Codex 团队) |
| 官网 | https://docs.astral.sh/ruff |
| 许可证 | MIT |
安装配置
# 方法1:用 uv 安装(推荐,最快)
uv tool install ruff@latest
# 方法2:用 pip 安装
pip install ruff
# 方法3:用 pipx 安装(隔离环境)
pipx install ruff
# 方法4:用 Homebrew 安装(macOS)
brew install ruff
# 验证安装
ruff --version # 应该显示 ruff 0.15.x
ruff check --help # 查看检查命令帮助
配置(pyproject.toml)
[tool.ruff]
target-version = "py311" # 目标 Python 版本
line-length = 88 # 每行最大字符数(和 Black 一致)
src = ["src", "tests"] # 源码目录
[tool.ruff.lint]
select = [ # 启用的规则集
"E", # pycodestyle 错误(PEP8 风格)
"F", # pyflakes(未使用变量、导入等)
"W", # pycodestyle 警告
"I", # isort(导入排序)
"N", # pep8-naming(命名规范)
"UP", # pyupgrade(升级老语法)
"B", # flake8-bugbear(常见 bug 模式)
"SIM", # flake8-simplify(简化代码)
"RUF", # Ruff 自有规则
]
ignore = [ # 忽略的规则
"E501", # 行太长(交给 formatter 处理)
]
fixable = ["ALL"] # 所有规则都可自动修复
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"] # __init__.py 允许未使用的导入
"tests/**" = ["S101"] # 测试文件允许用 assert
[tool.ruff.format]
quote-style = "double" # 双引号
indent-style = "space" # 用空格缩进
line-ending = "auto" # 自动检测换行符
基本使用
# ===== 代码检查(Lint) =====
ruff check . # 检查当前目录所有 Python 文件
ruff check src/ # 只检查 src 目录
ruff check main.py # 检查单个文件
# 自动修复
ruff check --fix . # 自动修复能修的问题
ruff check --fix --unsafe-fixes . # 包括"不太安全"的修复
# 查看具体规则说明
ruff rule E501 # 查看 E501 规则的详细说明
# ===== 代码格式化(Format) =====
ruff format . # 格式化所有文件
ruff format --check . # 只检查格式,不修改(CI 用)
ruff format --diff . # 显示格式差异但不修改
# ===== 导入排序 =====
ruff check --select I --fix . # 只修复导入排序问题
检查结果示例
src/main.py:10:1: F401 [*] `os` imported but unused
src/main.py:15:5: E711 Comparison to `None` (use `is None`)
src/utils.py:23:1: I001 [*] Import block is un-sorted or un-formatted
Found 3 errors (2 fixable)
高级用法
替代多个工具
# Ruff 一个工具替代这些:
# Flake8 → ruff check(代码检查)
# Black → ruff format(代码格式化)
# isort → ruff check --select I(导入排序)
# pyupgrade → ruff check --select UP(语法升级)
# autoflake → ruff check --select F(移除未使用导入)
# pydocstyle → ruff check --select D(文档字符串检查)
# 从 Flake8 迁移:一行命令
# Ruff 支持绝大多数 Flake8 规则,编号完全一样
# 直接把 .flake8 配置转到 pyproject.toml 即可
块级注释抑制(2026 新特性)
# 传统方式:每行都要加 noqa
x = some_func(A, B, C) # noqa: N803
y = some_func(D, E, F) # noqa: N803
# 新方式:块级抑制(Ruff 2026 新增)
# ruff: disable[N803]
x = some_func(A, B, C) # 这个范围内 N803 不报错
y = some_func(D, E, F)
# ruff: enable[N803]
# 文件级抑制
# ruff: file-ignore[E501] # 整个文件忽略 E501
CI/CD 集成
# .github/workflows/lint.yml
name: Lint
on: [push, pull_request]
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # 拉取代码
- uses: astral-sh/ruff-action@v3 # 官方 GitHub Action
with:
args: "check --output-format=github" # 检查并标注在 PR 中
- uses: astral-sh/ruff-action@v3
with:
args: "format --check" # 检查格式
VS Code 集成
// .vscode/settings.json
{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff", // 用 Ruff 格式化
"editor.formatOnSave": true, // 保存时自动格式化
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit", // 保存时自动修复
"source.organizeImports.ruff": "explicit" // 保存时排序导入
}
}
}
常用规则集说明
# 规则集编号 → 对应原工具 → 检查内容
# E/W → pycodestyle → PEP8 代码风格
# F → pyflakes → 逻辑错误(未使用变量等)
# I → isort → 导入排序
# N → pep8-naming → 命名规范
# UP → pyupgrade → Python 版本升级建议
# B → bugbear → 常见 bug 模式
# SIM → simplify → 代码简化建议
# C4 → comprehensions → 推导式优化
# DTZ → datetimez → datetime 时区问题
# S → bandit → 安全问题
# RUF → Ruff 原创 → Ruff 自有规则
常见报错与解决
| 报错/问题 | 原因 | 解决方案 |
|---|
| 规则冲突 | select 和 ignore 冲突 | ignore 优先级高于 select |
| 格式化后 lint 报错 | formatter 和 linter 规则冲突 | 把格式相关的 lint 规则交给 formatter |
| 文件被忽略 | 被 .gitignore 排除了 | Ruff 默认尊重 .gitignore,用 --no-respect-gitignore |
| 速度没提升 | 文件太少看不出差别 | 在大项目(1000+ 文件)差距明显 |
| 旧项目太多报错 | 规则选得太严格 | 先用少量规则,逐步添加 |
速查表
# ===== 检查命令 =====
ruff check . # 检查所有文件
ruff check --fix . # 自动修复
ruff check --select E,F,I . # 只检查指定规则
ruff check --ignore E501 . # 忽略指定规则
ruff check --statistics . # 按规则统计错误数
ruff check --output-format=json . # JSON 输出
# ===== 格式化命令 =====
ruff format . # 格式化
ruff format --check . # 检查格式(CI 用)
ruff format --diff . # 显示差异
# ===== 其他命令 =====
ruff rule E501 # 查看规则说明
ruff linter # 列出所有可用 linter
ruff clean # 清除缓存
# ===== 行内注释 =====
x = 1 # noqa: E501 # 本行忽略 E501
# ruff: noqa: E501 # 本行以下忽略 E501
# type: ignore # 忽略类型检查
同类工具对比
| 特性 | Ruff | Flake8 | Pylint | Black |
|---|
| 速度 | 极快(10-100x) | 慢 | 很慢 | 中等 |
| Lint | ✅ 800+ 规则 | ✅ 需插件 | ✅ 最全 | ❌ |
| Format | ✅ 内置 | ❌ | ❌ | ✅ |
| 导入排序 | ✅ 内置 | ❌ 需 isort | ❌ | ❌ |
| 自动修复 | ✅ 大部分 | ❌ | ❌ | ✅(格式) |
| 依赖 | 零依赖(二进制) | Python 包 | Python 包 | Python 包 |
| 配置 | pyproject.toml | .flake8 | .pylintrc | pyproject.toml |
总结:2026 年新 Python 项目直接用 Ruff,一个工具搞定 lint + format + import sort。老项目从 Flake8 迁移到 Ruff 也很简单,规则编号基本一样。Astral(Ruff 开发商)已加入 OpenAI,工具会持续高速发展。