几天前,Python 开源社区又出了一个不小的新闻:HTTPX 和 Starlette 在同一天将在用的代码剖析工具(flake8、autoflake 和 isort)对立替换成了 Ruff。
HTTPX 是一个反对异步的 HTTP 客户端,Starlette 是一个轻量级的 ASGI 框架,它们都是 Python 社区里的明星我的项目,目前加起来有近 20K star。它们都抉择了应用 Ruff,再次扩充了 Ruff 的利用幅员。
Ruff 是个诞生仅仅 8 个月的新兴我的项目,但已呈现出一种席卷 Python 社区的趋势!很多出名的开源我的项目已驳回 Ruff,比方 Transformers、Pandas、FastAPI、Airflow、SciPy、Bokeh、Jupyter、LangChain、PaddlePaddle、Sphinx、Pydantic、LlamaIndex……
Ruff 是什么?为什么它能吸引大量的开源我的项目应用?相比于其它代码剖析工具,它有哪些突出之处,是否还有一些局限性?当初是否值得将我的项目在用的工具都替换成它呢?
带着这些问题,本文将带你全方位理解这个火爆的我的项目。
Ruff 减速 Rust 与 Python 的交融
Ruff 诞生于 2022 年 8 月,它是一个用 Rust 语言编写的高性能的 Python 动态代码剖析工具,比其它剖析工具快几个数量级(10-100 倍),而且性能也很全面。
代码剖析工具
即 Linter,用于查看代码中的语法错误、编码标准问题、潜在的逻辑问题和代码品质问题等,能够提供实时反馈和主动修复倡议。
在 Ruff 呈现之前,社区里的代码剖析工具呈现出百花齐放之势,比方有 Pylint、Flake8、Autoflake、Pyflakes、Pycodestyle 等等,它们的共同点是都应用 Python 编写而成。
Ruff 异军突起,在性能方面立于不败之地,次要得益于 Rust 人造的速度劣势。Ruff 的呈现,就像基于大语言模型的 ChatGPT 横空出世,所有竞争对手霎时就黯淡失色了。
两个月前,我翻译了一篇《Python 2023 年的 3 个趋势》,它预测的第一个趋势就是 Rust 将放慢融入到 Python 相干的我的项目和工具中,举出的例子就有 Ruff。
我当初能够补充一个察看了: 用 Rust 开发的新工具将淘汰用其它语言开发的工具,而且新工具的遍及速度可能比你的料想快得多!
Ruff 我的项目的胜利,将刺激出更多 Python+Rust 的我的项目。它的作者 Charlie Marsh 立志于给 Python 构建高性能的开发工具,偶合的是我曾翻译过他写的《Using Mypy in production at Spring》,这篇文章恰好公布于 Ruff 诞生的 2022 年 8 月!
因而,我有理由揣测:在 Ruff 我的项目成熟后,他将用 Rust 开发高性能的 Python 类型查看工具,到时候,目前风行的 Mypy、Pytype、Pyright 和 Pyre 等工具将迎来一大劲敌。(题外话:Python 社区缭乱繁多的虚拟环境管理工具和依赖包管理工具,也无望迎来改革了吧!)
这里还必须介绍两个 Rust 我的项目,因为 Ruff 的胜利离不开它们:
- RustPython:用 Rust 写成的 Python 解释器。Ruff 利用了它高性能的 AST 解析器,以此实现了本人的 AST 遍历、拜访器形象和代码品质检测逻辑
- Maturin:用 Rust 写成的打包工具,能够将 Rust 我的项目打包成 Python 可用的包,从而能够被咱们“pip install”后应用,且不须要配置 Rust 环境
Ruff 的长处与局限性
介绍完最要害的个性后(速度极快、反对 pip),咱们接下来看看 Ruff 的其它方面。
总体而言,它具备这些特点:
- 反对
pyproject.toml
- 兼容 Python 3.11
- 超过 500 条内置规定,与 Flake8 内置的规定集近乎对等
- 从新实现了数十个 Flake8 插件,如 flake8-bugbear、flake8-comprehensions 等
- 反对主动修复,可主动纠正错误(例如,删除未应用的导入)
- 内置缓存,可防止反复剖析未更改的文件
- 反对 VS Code、Pycharm、Neovim、Sublime Text、Emacs 等编辑器
- 对 monorepo 敌对,具备分层和级联配置
首先最值得介绍的是它反对的规定。Ruff 借鉴了风行的工具如 Flake8、autoflake、isort、pyupgrade、yesqa 等等,而后用 Rust 从新实现了超过 500 条规定。它自身不反对插件,然而排汇了数十个罕用的 Flake8 插件的设计,使得已囊括的规定范畴比其它任何工具都大。
Ruff 的作者还十分相熟其它语言的剖析工具,比方 Rust 的 Clippy 和 JavaScript 的 ESLint,并从这些我的项目上失去了设计上的启发。
Ruff 站在了多个工具 / 插件的肩膀上,从新实现了它们验证过的规定,也借鉴了它们的 API 和实现细节,这使得它表演了一种“集大成”的角色,很不便使用者们作工具的顺滑迁徙。
Ruff 第二个值得介绍的特点是,它没有局限于 Linter 的定位,而是借鉴 Rome、Prettier 和 Black 这些代码格式化工具(Formatter),也实现了代码格式化的性能。借鉴了 Autoflake、ESLint、Fixit 等工具,实现了代码主动纠错的性能。另外,它还借鉴了应用很宽泛的 isort,反对对 import 作疾速排序。
这些表明作者的指标并不只是开发一款优良的代码剖析工具,而是在动态代码剖析的外围性能外,要发明出更多的可能性。此举是开发者的福音啊,当前一个工具就能满足多种诉求,再也不用纠结于不同工具的选型、合作与保护了!
Ruff 还有其它的长处,例如反对 pyproject.toml
、反对 Python 3.11、反对只剖析变更的文件,等等。另外,它也有着一些局限性:
- 反对的 lint 规定还有不够
- 不反对应用插件,扩展性不强
- 用 Rust 开发的,因而不便于在出错时 debug,也不便于 Python 开发者给它奉献代码
对于第一点,毕竟 Ruff 只是 8 个月大的新生我的项目,反对更多的规定,只是工夫问题。至于插件带来的扩展性和编程语言的开发者生态,起因也是 Rust,属于“有得必有失”了。
Ruff 的应用
介绍完 Ruff 的整体状况后,咱们接着看看该如何应用它吧。
首先是装置,能够用 Conda 和其它包管理工具,也能够间接用 pip:
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 提供了官网的 VS Code 插件,能够疾速上手:
Ruff 官网没有提供 Pycharm 的插件,社区中有人公布了一个 Ruff 插件。
另外,它还提供了 ruff-lsp
,能够被集成到任何反对 Language Server Protocol 的编辑器中,例如 Neovim、Sublime Text、Emacs 等等。
小结
本文从 HTTPX 和 Starlette 驳回 Ruff 的新闻开始,向读者介绍了这个仅诞生 8 个月却俘获了一大批出名开源我的项目。它最突出的特点是应用 Rust 开发,因而在性能方面远远超过同类工具,此外,它借鉴了泛滥工具和插件的设计,不仅动态代码剖析的规定全面,而且还具备代码格式化、代码主动纠错和 import 排序等非其它 linter 所领有的性能。
Ruff 的胜利为 Python 社区提供了一个鲜活的楷模,能够预感,咱们将迎来一波用 Rust 开发的高性能工具。Ruff 的胜利,与最近火爆的 ChatGPT 一样,它们传递出了一个“ 这事儿能成 ”的信号,从而会引爆一场应用新技术的改革!(十分偶合的是:Rust 1.0 在 2015 年 5 月公布,而 OpenAI 在 2015 年 12 月成立。)
总体而言,Ruff 十分弱小,凭实力而风靡 Python 社区,相对举荐应用!它的应用文档很敌对,如果你想理解更多细节,能够去翻查。