Ruff - 使用 Rust 开发的 Python Linter 工具

Linters 是用于分析程序源代码的一种工具,用来检测如语法错误、样式等。它们对于维护项目中的代码质量和可读性非常重要,同时还可以在开发周期的早期捕捉到 bug。在 Rust 中我们通常使用 Clippy ,它已经内置了超过 600 多个规则,和编译器一起成为我学习 Rust 编程语言的一种方式。在 Python 中有 PylintFlake8Pyflakespycodestyle(pep8)多个使用 Python 实现的 lint 工具,每一种工具都有自己的检查规则。Ruff 是 2022 年 8 月发布的,使用 Rust 实现的一个新的 Python Linter 工具。在 macOS 环境下使用 CPython 的代码仓库进行测试,比 PylintFlake8Pyflakespycodestyle(pep8)都快出了很多倍。

"Lint" 的词源可以追溯到古英语中的 "lynnet" 或 "linet",意为亚麻布的残余物。后来这个词被用来指棉花或纺织品生产过程中的残余物。在计算机编程中,"lint" 一词被用来指一种静态代码分析工具,可以扫描代码中的潜在问题和错误。这种使用方法的来源可以追溯到1960年代,在当时的贝尔实验室,一名计算机科学家发明了一个名为 "lint" 的工具,用于帮助发现代码中的错误。这个工具的名称被选中是因为它的创始人发现代码中的问题有时像棉绒一样微小而难以看到,而 "lint" 就是处理棉花时产生的残余物。- From ChatGPT

Ruff 实现了一个缓存机制,在每次检查的时候只对上次检查修改过的代码进行扫描。如果使用 Flake8 实现类似的缓存机制,必须使用 flake8-cache 。Ruff 实现了以上 lint 工具的部分规则,加上自己定义的规则已经接近 500 条。Ruff 执行速度快于用 Python 实现的同类型工具的主要原因是,使用了 RustPython 的 AST(Abstract Syntax Tree),针对每个 Python 文件都生成 AST 提升遍历的速度。

抽象语法树(Abstract Syntax Tree,简称 AST)是一种用于表示源代码结构的树形数据结构。在编译器和解释器的工作过程中,AST 是源代码语法分析(parsing)阶段的核心产物。其目的是以更简洁、更高层次的方式表示源代码的逻辑结构,以便于进一步的编译、优化和执行。- From ChatGPT

Ruff 可以集成到现在已有的编辑器中,或 Language Server Protocol 中,在 GitHub Action 中使用将极大的提高 Action 的执行速度。

name: Ruff
on: [ push, pull_request ]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: chartboost/ruff-action@v1
				with:
				    src: "./src"
				    version: 0.0.259
				    args: --select B

更多信息访问 官方文档 或阅读原文 Ruff: a fast Python linter

4 月中 Ruff 的作者 Charlie Marsh 宣布成立了一家叫 Astral 的 Startup 公司,针对 Python 生态开发更多的工具,使用 Rust 带来更多效率的提升。

从 Deno、Artichoke 到 RustPython ,包括各种使用 Rust 实现的编程语言,可以看到 Rust 有成为编程语言底层实现的一个选择,Rust 也逐渐成为整个底层基础软件领域的重要选择;海外的商业生存环境是比国内友好太多,一个开发者工具就可以成为一个创业公司的起点,在当前国内无处不卷死的大环境下,这样的公司是不可能产生,也扼杀了很多创新的机会。当很多人还讨论商业和开源的关系时,别人已经从开源走向商业了。