ruffpython工具链代码质量量化开发火箭提速

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 倍加速

建议

  1. 先安全修复,再手动修复,最后整理 ignore 列表
  2. ptrade/ 实盘文件用 per-file-ignores 保护,避免误改回测不一致
  3. 加入 CI/CD 流程:在 pre-commit hook 或 GitHub Actions 中加 ruff check 检查
  4. 格式化和检查分开执行ruff format 处理后端代码风格,ruff check 保证代码质量

💬 评论