Ruff v0.4.5 现已发布!请从 PyPI 或您选择的包管理器安装。

pip install --upgrade ruff

Ruff 是一个用 Rust 编写的极速 Python 代码检查器和格式化工具。Ruff 可以替代 Black、Flake8(以及数十个插件)、isort、pydocstyle、pyupgrade 等工具,其执行速度比任何单个工具快数十甚至数百倍。


本次发布标志着我们集成式、基于 Rust 的语言服务器Beta 版本发布,该服务器为 Ruff 的 VS Code 扩展和其他编辑器集成提供诊断和格式化功能。

上个月,我们发布了 Ruff v0.4.0 的 Alpha 版本。自那时起,我们对服务器进行了多项稳定性改进,并引入了一些主要功能,使我们更接近完全取代我们之前的基于 Python 的语言服务器 ruff-lsp

如果您想开始使用 ruff server,请在 Ruff 的 VS Code 扩展中启用它,或阅读设置指南

用 Rust 重写

Ruff 的编辑器集成始终由语言服务器提供支持。与 Pylance 或 Jedi(它们是 Python 的通用语言服务器)不同,Ruff 的语言服务器在 VS Code 或 Neovim 等编辑器中提供代码检查、格式化和自动修复功能。

2022年12月,我们推出了 ruff-lsp,这是一个用 Python 编写的语言服务器,通过命令行与 Ruff 交互。

虽然 ruff-lsp 在一段时间内运行良好,但我们遇到了根本性的技术限制,使得维护和扩展变得困难。

  • ruff-lsp 的开发、测试和发布都独立于 Ruff,这意味着我们需要维护与各种 Ruff 版本的兼容性。
  • 由于 ruff-lsp 与 Ruff 的命令行界面交互,每个新功能都必须在面向用户的选项中公开,并且所有支持集成的必要数据都必须通过标准输入和输出传递。
  • 重复将 Ruff 作为无状态子进程运行,导致每次请求都产生不必要的开销。
  • 由于 Ruff 的每次调用都是一个独立的进程,我们无法实现需要跨多个请求跟踪状态的 LSP 功能(例如,在编辑器中修改但未保存到磁盘的文件),因为 Ruff 本身是以无状态方式使用的。

我们意识到,如果我们的语言服务器要跟上 Ruff 的快速发展,它就需要与 Ruff 本身紧密集成。

这就是 ruff server 的用武之地:一个用 Rust 编写并内置于 Ruff 中的语言服务器。

ruff-lsp 类似,它为我们的 VS Code 扩展和编辑器集成提供代码检查、格式化及其他功能。但与 ruff-lsp 不同的是,ruff server 直接将 Ruff 作为库使用,这使得集成比 ruff-lsp 更容易(并且性能更好!)。由于它是 Ruff 本身的一部分,因此无需安装外部包。

最终,ruff server 为我们构建更强大、功能更丰富的编辑器集成奠定了基础,同时在此过程中为用户带来了显著的性能提升和更流畅的安装体验。

功能

ruff server 支持您从 ruff-lsp 中熟悉并喜爱的一切功能,同时还引入了一些新功能。得益于可扩展的架构,我们未来计划推出更多功能。

诊断高亮

Ruff 会在您输入的同时,迅速显示规则违规和语法错误。

Editing a file in Helix

动态配置

当您更新配置时,Ruff 会动态刷新诊断信息。

Editing a `pyproject.toml` configuration file in VS Code

格式化

Ruff 可以即时格式化您的代码。

Formatting a document in VS Code

代码操作

Ruff 可以使用代码操作在几秒钟内解决您代码中的问题。

Applying a quick fix in Helix

您也可以选择使用 noqa 注释完全忽略诊断信息。

Creating a `noqa` comment in VS Code

源操作

Ruff 提供源操作和命令,可以重新格式化代码或解决整个文件中的问题。

Using the `source.fixAll` source action in Helix

您甚至可以在保存时运行这些操作。例如,要在 VS Code 中实现保存时格式化,请将以下内容添加到您的 settings.json

{
  "[python]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "charliermarsh.ruff"
  }
}

保存时,Ruff 将自动格式化您的代码。

Formatting on save in VS Code

悬停提示

Ruff 可以显示 # noqa 代码的文档。

Hovering over a noqa code in VS Code

Jupyter Notebook

ruff server 完全支持 Jupyter Notebook 文件。我们甚至支持 Notebook 单元格内的范围格式化。

Editing multiple Jupyter Notebook cells in VS Code
Formatting a selection within a Jupyter Notebook cell in VS Code

下一步

我们对 ruff server 的未来感到非常兴奋。以下是接下来的计划:

  • 支持更多编辑器:目前,我们支持 VS Code、Neovim 和 Helix。我们至少计划支持 ruff-lsp 官方支持的所有编辑器。但预计我们将超越这些。
  • 弃用 ruff-lsp ruff server 将是 ruff-lsp 的即时升级替代品。我们计划弃用并最终归档旧的语言服务器。
  • 支持未来的 Ruff 功能: 未来的 Ruff CLI 功能将在语言服务器中获得相应的支持。
  • 支持更通用的语言服务器功能:我们计划将服务器的功能扩展到代码检查、格式化和诊断之外。

总的来说,我们使用 ruff server 的目标是构建最好、功能最丰富的 Python 语言服务器。本次发布是实现该目标的一个重要里程碑。