告别 Pylint 龟速查重!Rust 打造的 Python 代码查重神器 Arid 2.0 发布,速度狂飙 200 倍
大家好,我是提米大门(TMDM.cn)的提米哥。今天咱们来聊聊 Python 开发者经常遇到的一个痛点:代码查重。
在 Python 圈子里,大家做代码检查通常会用 Ruff,它速度极快,几乎瞬间就能扫完整个项目。但 Ruff 有个遗憾:它不支持“重复代码检测”。如果你非要查重,就只能请出老牌的 Pylint,使用它的 R0801 规则。
然而,Pylint 的查重速度简直慢得让人抓狂。每次跑查重,你都只能盯着屏幕发呆。为了解决这个“又要快、又要能查重”的矛盾,开发者 Bob Taylor 用 Rust 语言打造了一款专门针对 Python 的重复代码检测工具——Arid。
最近,Arid 迎来了重磅的 2.0 版本。提米哥带大家看看,这款工具到底有多硬核,又是如何让新手和老鸟都能轻松上手的。
速度依然是王道:比 Pylint 快 200 倍
Arid 2.0 并没有去重写底层那个已经非常优秀的检测引擎,而是保留了 1.0 版本的核心逻辑:精准查找完全重复的 Python 代码,并自动忽略注释、文档字符串和导入语句的干扰。
既然引擎没变,那速度自然依旧起飞。在官方针对几个知名开源项目的测试中,Arid 2.0 对比 Pylint 4.0.6 的查重速度如下:
- Requests 项目:比 Pylint 快 191.19 倍
- Pydantic 项目:比 Pylint 快 219.06 倍
- Polaris 项目:比 Pylint 快 249.68 倍
这意味着,以前需要等几分钟的查重任务,现在 Arid 几秒钟就能搞定。
2.0 版本的核心升级:让工具融入你的工作流
如果说 1.0 版本证明了 Arid “足够快”,那么 2.0 版本则解决了“如何让它更好用”的问题。提米哥为大家总结了几个最接地气的新特性:
1. 给重复代码发“身份证”(稳定指纹)
以前,如果代码里插入了一行新代码,导致后面的行号全变了,查重工具就会认为这是一个“新”的重复问题。Arid 2.0 给每个重复代码块生成了独立的指纹,不管文件怎么移动、行号怎么变,只要代码内容没变,指纹就不变。
# 这是 Arid 生成的唯一指纹格式,包含版本号和哈希值
# 它不受文件路径、物理行号或代码出现顺序的影响
arid-finding-v1:sha256:...
2. 聚焦你关心的目录,但不漏掉全局
假设你正在修改 src/payments/(支付模块),你只想看这个模块里的重复代码。但如果你只扫描这个目录,可能会漏掉它和 src/customers/(客户模块)之间的重复。
Arid 2.0 巧妙地分离了“分析范围”和“报告范围”:
# 支付模块的目录路径
src/payments/
# 客户模块的目录路径
src/customers/
# 使用 --focus 参数,Arid 会在后台扫描整个项目,但只在终端里向你报告 src/payments 目录下的重复问题
arid . --focus src/payments
3. 优雅处理“历史遗留债务”
老项目里往往有几百处重复代码,不可能一天改完。Arid 提供了“基线(Baseline)”功能,你可以把现有的重复代码记在账本上,然后禁止新的重复代码提交。
# 检查当前的重复代码状态,并与基线文件进行对比
arid . --baseline-status arid-baseline.json
# 清理基线文件中已经不再存在的“陈旧”记录,保持账本干净
arid . --prune-baseline arid-baseline.json
这就形成了一个非常健康的代码治理生命周期:
# 1. 发现现有的重复代码
existing duplication
↓
# 2. 将其加入基线(暂时接受历史债务)
baseline it
↓
# 3. 阻止新的重复代码产生
prevent new duplication
↓
# 4. 在日常开发中逐步重构老代码
refactor existing duplication over time
↓
# 5. 清理基线中已修复的条目
prune stale baseline entries
↓
# 6. 基线越来越小,代码越来越干净
smaller baseline
4. 遇到错误不罢工(容错机制)
扫描 3000 个文件时,如果其中 1 个文件因为语法错误无法解析,难道整个扫描就要失败吗?Arid 2.0 允许你跳过错误文件,继续扫描剩下的 2999 个。
# 使用 --keep-going 参数,遇到解析失败的文件不会中断,同时输出 JSON 格式结果
arid . --keep-going --json
在输出的 JSON 中,它会诚实地告诉你这次扫描是不完整的:
{
// 明确标记此次分析未完成,让自动化脚本知道有文件被跳过了
"complete": false
}
5. 一次扫描,多种格式输出
在自动化流水线中,你可能需要给开发者看文本,给系统存 JSON,给 GitHub 传 SARIF(一种通用的代码扫描结果格式)。以前你需要跑四次工具,现在一次搞定:
# 一次扫描,同时生成终端文本、JSON、Markdown 和 SARIF 四种格式的报告
arid . \
--format text \
--report json=artifacts/arid.json \
--report markdown=artifacts/arid.md \
--report sarif=artifacts/arid.sarif
6. 对 AI 编程助手更友好
现在的开发者都在用 AI 辅助写代码。AI 助手在生成代码时,文件可能还没保存到硬盘上。Arid 2.0 支持通过标准输入传入“虚拟代码”进行查重:
# 将 example.py 的内容通过管道传给 Arid,并指定虚拟路径,Arid 会在不修改硬盘文件的情况下进行查重
cat src/example.py | arid . --stdin-path src/example.py
7. 官方 GitHub Action 上线
如果你用 GitHub 托管代码,现在可以直接使用官方的 Action,一键将 Arid 集成到你的自动化测试中:
# 在 GitHub Actions 工作流中直接调用 Arid 2.0
- uses: sponge-b0b/arid@v2.0.0
with:
paths: .
提米哥的实战建议
Arid 并不是要取代 Ruff,它们是完美的搭档。提米哥建议大家在工作流中这样组合使用:
# 先用 Ruff 进行常规的代码规范和语法检查
ruff check .
# 再用 Arid 进行极速的代码重复检测
arid .
如何安装和体验?
你可以使用现代 Python 包管理工具 uv 来安装:
# 使用 uv 安装 Arid 2.0.0 版本并运行
uv tool install "arid==2.0.0"
arid .
或者使用传统的 pip:
# 使用 pip 安装 Arid 2.0.0 版本并运行
python -m pip install "arid==2.0.0"
arid .
如果你受够了 Pylint 的龟速查重,或者正在寻找一款能完美融入 CI/CD 流水线的代码查重工具,Arid 2.0 绝对值得你立刻尝试。