Python 工具链 Rust 化迁移:ruff 接手 12,767 个代码问题的实战记录
为什么从 flake8/pylint 迁移到 ruff?
核心痛点: 量化项目中多因子回测引擎、实时模拟交易、策略优化循环——任何一个全量代码检查都要等 5-15 秒。在大规模因子扫描循环中,每次提交前检查的等待时间显著影响开发节奏。
解决方案: 用 Rust 重写的 ruff 替代传统 Python linter。单次全量扫描仅需 0.022 秒,比 flake8/pylint 快 200-1000 倍。
迁移成果
| 指标 | 数值 |
|---|---|
| 初始发现问题 | 12,767 |
| 安全自动修复 | 9,189 |
| 手动分阶段修复 | 3,524 |
| ptrade/ 目录保护 | 879 个(策略铁律:不修改) |
| 最终非ptrade残留 | 19 个(第三方API引用,需人工判断) |
| 全量扫描耗时 | 0.022 秒 |
配置方案
新建 pyproject.toml,5 行核心配置即可运行:
[tool.ruff]
line-length = 120
target-version = "py311"
[tool.ruff.lint]
select = ["E", "F", "W", "I", "UP", "B"]
[tool.ruff.lint.per-file-ignores]
"ptrade/*.py" = ["F821"] # Ptrade 平台注入的全局变量
"QuantaAlpha/**" = ["F821", "B023", "B018"]
分阶段修复策略(实战流水线)
第一阶段:安全自动修复(Phase 0-1)
ruff check . --fix # 安全修复
ruff check . --unsafe-fixes # 进一步清理
这个步骤清理了 9,819 个问题——全是格式类(尾随空格、空白行、未排序import等)。
第二阶段:手动批量修复
bare except(Phase 2) — 350 个案例
# 改前
try:
do_something()
except:
pass
# 改后
try:
do_something()
except Exception:
pass
语法错误修复(Phase 3) — 修复了 4 个文件。其中一个是带有行号前缀 1|2|3|... 的编码污染,其余为批量替换遗漏的空格问题。
未使用的循环变量(Phase 5) — 30 处
# 改前
for wk in weeks:
compute()
# 改后
for _wk in weeks:
compute()
第三阶段:格式化(Phase 4)
ruff format 一次性修复 321 个文件的 E701(一行多条语句)和 E702(分号分隔)问题,比手写正则安全 N 倍。
保护 Ptrade 实盘策略文件
根据 “策略迁移铁律”:ptrade/ 目录只改API函数名和参数格式,策略逻辑一行不动。因此对 ptrade/ 文件统一豁免 F821(未定义名称),因为回测/实盘运行时,g、log、set_universe、get_history 等都是由 Ptrade 平台在运行前注入的全局变量。
"ptrade/*.py" = ["F821"]
"engine_v2/ptrade_*.py" = ["F821"]
完整 pyproject.toml(模板)
[tool.ruff]
line-length = 120
target-version = "py311"
extend-exclude = [
"**/git_ignore_folder/**",
"**/RD-Agent_workspace/**",
".venv",
"venv",
]
[tool.ruff.lint]
select = ["E", "F", "W", "I", "UP", "B"]
ignore = [
"E501", # 行长度由 formatter 管
"E402", # Jupyter/脚本中 import 位置常见问题
"B008", # Web framework 默认参数常见模式
"E741", # 量化代码中 l 变量常见(len() 简写)
"B023", # lambda/apply 中的循环变量闭包
"UP031", # % 格式化虽旧但没问题
]
[tool.ruff.format]
quote-style = "double"
效果验证
# 单次全量检查
$ time ruff check .
ruff check . 0.00s user 0.02s system 99% cpu 0.022 total
All checks passed!
# 与旧方案对比
flake8 . # ≈ 7-15 秒
ruff check . # ≈ 0.022 秒 → 300-700 倍加速
建议
- 先安全修复,再手动修复,最后整理 ignore 列表
- ptrade/ 实盘文件用 per-file-ignores 保护,避免误改回测不一致
- 加入 CI/CD 流程:在 pre-commit hook 或 GitHub Actions 中加
ruff check检查 - 格式化和检查分开执行:
ruff format处理后端代码风格,ruff check保证代码质量