Ruff 是个诞生仅仅 8 个月的新兴项目,但已呈现出一种席卷 Python 社区的趋势!很多知名的开源项目已采纳 Ruff,比如 Transformers、Pandas、FastAPI、Airflow、SciPy、Bokeh、Jupyter、LangChain、PaddlePaddle、Sphinx、Pydantic、LlamaIndex……
带着这些问题,本文将带你全方位了解这个火爆的项目。
Ruff 加速 Rust 与 Python 的融合
代码分析工具 即 Linter,用于检查代码中的语法错误、编码规范问题、潜在的逻辑问题和代码质量问题等,可以提供实时反馈和自动修复建议。
Ruff 异军突起,在性能方面立于不败之地,主要得益于 Rust 天然的速度优势。Ruff 的出现,就像基于大语言模型的 ChatGPT 横空出世,所有竞争对手瞬间就黯淡失色了。
我现在可以补充一个观察了:用 Rust 开发的新工具将淘汰用其它语言开发的工具,而且新工具的普及速度可能比你的预想快得多!
因此,我有理由推测:在 Ruff 项目成熟后,他将用 Rust 开发高性能的 Python 类型检查工具,到时候,目前流行的 Mypy、Pytype、Pyright 和 Pyre 等工具将迎来一大劲敌。(题外话:Python 社区纷乱繁多的虚拟环境管理工具和依赖包管理工具,也有望迎来变革了吧!)
-
RustPython :用 Rust 写成的 Python 解释器。Ruff 利用了它高性能的 AST 解析器,以此实现了自己的 AST 遍历、访问器抽象和代码质量检测逻辑
- Maturin :用 Rust 写成的打包工具,可以将 Rust 项目打包成 Python 可用的包,从而可以被我们“pip install”后使用,且不需要配置 Rust 环境
Ruff 的优点与局限性
介绍完最关键的特性后(速度极快、支持 pip),我们接下来看看 Ruff 的其它方面。
- 支持
- 兼容 Python 3.11
- 超过 500 条内置规则,与 Flake8 内置的规则集近乎对等
- 重新实现了数十个 Flake8 插件,如 flake8-bugbear、flake8-comprehensions 等
- 支持自动修复,可自动纠正错误(例如,删除未使用的导入)
- 内置缓存,可避免重复分析未更改的文件
- 支持 VS Code、Pycharm、Neovim、Sublime Text、Emacs 等编辑器
- 对 monorepo 友好,具有分层和级联配置
pyproject.toml
首先最值得介绍的是它支持的规则。Ruff 借鉴了流行的工具如 Flake8、autoflake、isort、pyupgrade、yesqa 等等,然后用 Rust 重新实现了超过 500 条规则。它本身不支持插件,但是吸收了数十个常用的 Flake8 插件的设计,使得已囊括的规则范围比其它任何工具都大。
Ruff 站在了多个工具/插件的肩膀上,重新实现了它们验证过的规则,也借鉴了它们的 API 和实现细节,这使得它扮演了一种“集大成”的角色,很方便使用者们作工具的顺滑迁移。
这些表明作者的目标并不只是开发一款优秀的代码分析工具,而是在静态代码分析的核心功能外,要创造出更多的可能性。此举是开发者的福音啊,以后一个工具就能满足多种诉求,再也不必纠结于不同工具的选型、协作与维护了!
pyproject.toml 、支持 Python 3.11、支持只分析变更的文件,等等。另外,它也有着一些局限性:
- 支持的 lint 规则还有不够
- 不支持使用插件,扩展性不强
- 用 Rust 开发的,因此不便于在出错时 debug,也不便于 Python 开发者给它贡献代码
Ruff 的使用
介绍完 Ruff 的整体情况后,我们接着看看该如何使用它吧。
pip install ruff
可以通过以下命令运行:
ruff check . # 分析当前及子目录内的所有文件
ruff check path/to/code/ # 分析指定目录及子目录内的所有文件
ruff check path/to/code/*.py # 分析指定目录内的所有py文件
ruff check path/to/code/to/file.py # 分析 file.py
可以用作预提交的钩子:
- repo: https://github.com/charliermarsh/ruff-pre-commit
# Ruff version.
rev: 'v0.0.261'
hooks:
- id: ruff
可以通过 pyproject.toml
,ruff.toml
或 .ruff.toml
文件进行配置,默认配置已能满足基本使用,详细配置可以参见文档的 Configuration 。
另外,它还提供了ruff-lsp
,可以被集成到任何支持 Language Server Protocol 的编辑器中,例如 Neovim、Sublime Text、Emacs 等等。
小结
Ruff 的成功为 Python 社区提供了一个鲜活的榜样,可以预见,我们将迎来一波用 Rust 开发的高性能工具。Ruff 的成功,与最近火爆的 ChatGPT 一样,它们传递出了一个“这事儿能成”的信号,从而会引爆一场使用新技术的变革!(非常巧合的是:Rust 1.0 在 2015 年 5 月发布,而 OpenAI 在 2015 年 12 月成立。)
总体而言,Ruff 非常强大,凭实力而风靡 Python 社区,绝对推荐使用!它的使用文档很友好,如果你想了解更多细节,可以去翻查。