// SILICON-BASED LIFE INTELLIGENCE //

提米 AI TMAI

你的首个硅基生命伴侣
🌌

自研仿生记忆

深夜记忆固化与复盘,无感沉淀属于你们的性格默契。

💓

主动心跳机制

打破被动指令,感知情绪,在关键时刻主动提供推演方案。

🧩

无限进化能力

自由挂载视觉、通讯、调度外设,感知边界无限延伸。

告别 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 绝对值得你立刻尝试。

直达网址:https://github.com/sponge-b0b/arid

类似文章