Ruff是一个用Rust编写的超高速Python代码检查与格式化工具。它集成了linting和formatting功能,旨在替代Flake8、isort、Black等传统工具链。我在处理一个包含300+文件的项目时首次接触Ruff,当时其他工具需要近30秒完成的检查,Ruff仅用0.8秒就完成了——这种性能差异让我决定深入研究这个工具。
与传统Python工具不同,Ruff的核心优势在于:
Ruff内置了完整的Flake8规则实现,包括:
典型使用方式:
bash复制# 检查当前目录
ruff check .
# 显示错误来源
ruff check --show-source .
# 自动修复可修复的问题
ruff check --fix .
我在迁移现有项目时发现,Ruff对Flake8规则的兼容性超过95%,但有几个特殊案例需要注意:
Ruff的格式化器设计理念类似Black,但提供了更多配置选项:
配置示例(pyproject.toml):
toml复制[tool.ruff.format]
line-length = 100
quote-style = "single"
重要提示:格式化规则与Black存在细微差异,混合使用可能导致格式震荡。建议完全迁移到Ruff或保持单一工具链。
Ruff的性能秘密在于:
实测数据(检查Django代码库):
| 工具 | 耗时 | 内存占用 |
|---|---|---|
| Flake8 | 28.3s | 210MB |
| Ruff | 0.9s | 18MB |
Ruff采用两级缓存:
bash复制# 清除缓存
ruff clean
推荐的最小配置(pyproject.toml):
toml复制[tool.ruff]
line-length = 100
select = ["E", "F", "W", "RUF"]
ignore = ["E501"]
[tool.ruff.format]
quote-style = "single"
.pre-commit-config.yaml示例:
yaml复制repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
- id: ruff-format
settings.json配置:
json复制{
"python.linting.enabled": true,
"python.linting.ruffEnabled": true,
"editor.formatOnSave": true,
"python.formatting.provider": "ruff"
}
分阶段迁移策略:
bash复制flake8 . && ruff check .
toml复制[tool.ruff]
extend-select = ["PL"]
格式化迁移步骤:
bash复制ruff format --diff
pyproject.toml调整规则bash复制ruff format .
toml复制[tool.ruff]
exclude = ["*/migrations/*.py"]
bash复制ruff check --depth 2 .
toml复制[tool.ruff]
ignore = ["E501", "F401"]
python复制# ruff: noqa: F401
from .utils import *
python复制# ruff: noqa: E402
import sys
sys.path.append("...")
通过RUF900系列扩展:
toml复制[tool.ruff]
select = ["RUF", "RUF900"]
示例规则(检查TODO注释):
python复制# ruff: noqa: RUF901
# TODO: 需要优化
部门规范示例:
toml复制[tool.ruff]
forbid-submodules = ["pandas"]
conftest.py配置:
python复制def pytest_sessionstart(session):
from ruff import __version__
assert __version__ >= "0.1.0"
安装额外依赖:
bash复制pip install ruff-jupyter
使用方式:
bash复制ruff check notebook.ipynb
使用hyperfine进行性能测试:
bash复制hyperfine --warmup 3 \
"flake8 ." \
"pylint ." \
"ruff check ."
典型结果(中型代码库):
| 工具 | 平均耗时 | 峰值内存 |
|---|---|---|
| Flake8 | 12.4s | 185MB |
| Pylint | 47.2s | 420MB |
| Ruff | 0.6s | 22MB |
Ruff的近期发展重点:
保持更新的建议:
bash复制pip install --upgrade ruff
ruff check --upgrade