赛博红兔的科技博客

CyberHongTu shares news, insights, and musings on fascinating technology subjects.


Ruff使用指南:最新的超快速代码格式化工具

大家好,欢迎回到“Python五分钟”,我是赛博红兔。这一期,我们来看看如何使用最近特别受欢迎的Python代码静态分析和格式化工具——Ruff。我自己已经用它有一段时间了,确实功能非常的强大,可以说整合了不少的工具,比如说Flake8,isort,Black,autopep8等等。另外,他和亲兄弟上一期介绍的UV工具一样,都是由Rust编写的。所以它比现有的代码检查器和格式化工具都要快10到100倍。对于大型项目检查速度几乎也是“秒出结果”。另外,Ruff支持更灵活的配置,可以通过pyproject.toml精确配置启用和禁用哪些格式化规则,它的默认规则可以有效帮助用户及时发现语法错误、未使用的变量等等问题,养成良好的编码习惯。同时,Ruff提供了800多条可选规则,来满足Python深度用户和企业级项目对代码规范的更高要求。赶紧给我点赞、三连支持一下。接下来,我会给大家展示如何在命令行中使用Ruff来适配各种编译环境。

首先,我们需要安装它。同样,官方给出了很多方法。最推荐的方法是用UV来安装。上一期我们说了UV管理工具的强大之处,我会在下面给出上一期的视频链接。上一期有朋友留言让我补充一下UV Tool工具配置的功能介绍,在这里我顺带就介绍一下。我们可以用uv tool install ruff把Ruff安装为一个全局工具。或者用uv add –dev ruff把它添加到你单独一个项目里。之后Ruff就会默认安装到这个路径下:C:\Users\<你的用户名>\AppData\Roaming\uv\tools。可以用uv tool upgrade ruff来升级工具到最新版本,用uv tool list来列出所有已安装的工具。还有,uv tool uninstall ruff来卸载Ruff。当然啦,也可以用传统的pip install ruff把它直接安装到你本地项目的虚拟环境中。但缺点是Ruff只在当前的虚拟环境下可用,还可能污染环境,所以不是特别推荐。哎,这时候用pipx (pipx install ruff)来安装就比较合适。它会把Python的库安装到隔离的环境中,但又能让你在命令行中全局调用它们。无论你选择哪种安装方法,你都可以在窗口打ruff,如果可以看到一串Ruff的说明就算安装成功了。

接下来,为了展示Ruff的功能,我先把VS Code里所有检查格式的扩展通通都卸载了,然后用UV创建了一个项目叫ruff_demo,里面有个Python的演示脚本。

import sys, os
def hello():
   name="World"
print(os.name)
if __name__=='__main__':
   hello()

里面的代码本身没有什么意义,但是包含了一些不规范的格式。我们先来运行一下,我们看到它本身没有什么错误,能够成功运行。我们再来看看命令行里使用Ruff来检查一下这段代码。我们用ruff check main.py。运行之后我们看到Ruff报告了3个错误,其中2个是可以通过自动修复选项来修复的。这次Ruff检查用的是它默认的规则,我们稍后会介绍如何检查更多规则下的错误。如果我们想一次性检查多个文件,可以用ruff check .对整个目录进行Ruff检查。我们来看看具体有哪些不规范的格式:第一个是在一行里导入了多个库,这里的sys和os库写在一行里是不推荐的。第二个是sys这个库脚本里并没有使用,建议去除。第三个是变量name在定义完之后并没有实际使用。这些错误有些你可能马上就理解,有些可能不太清楚它为什么是错误。实际上,我发现Ruff是一个非常好的学习Python的工具。因为它不光指出错误,而且它的文档会详细解释为什么这是一个问题,然后提供如何改进的例子。比如说,这里它每个错误都有对应的错误代码,你可以在官方文档上查询具体信息,我们之后还会演示。那么前两个带星号的不规范格式是可以用ruff check . –fix来修复的。我们看到Ruff会非常小心地只修复那些不会破坏你代码功能的问题。你说你不管了,想要完全修复所有建议,那就用ruff check . –fix –unsafe-fixes命令,后果自负。当然,有时候你可能不想Ruff自动更改代码,特别是你还不确定它会做什么的时候。可以用–diff选项 (ruff check . –diff)先预览Ruff将要做的更改。这里,Ruff会像Git的diff工具那样显示出它的改动:红色是要去除的内容,绿色是要添加的。

Ruff还包含了一个兼容Black的代码格式化器。我们可以用命令ruff format来格式化代码。运行之后,我们发现脚本的格式被自动修改了,像是缩进、空行、空格等等。通常我们先运行ruff check –fix来修复错误,然后再运行ruff format来格式化代码。这样可以避免自动修复对格式造成的混乱。

如果你在编写脚本的同时保持命令窗口打开,那么也可以使用Ruff的实时检查功能。我们用ruff check . –watch来开启实时检查你的代码变动。比如,我这里在脚本新加一个没有使用的numpy库,终端中就会立即显示警告。如果你想停止这种监视模式,可以按Ctrl+C来退出。

接下来我们来聊聊Ruff的配置,Ruff的默认规则已经非常好了,初学者或者对项目要求不高的朋友根本不用去动这块。但Ruff的强大之处在于实际上它内置了超过800条规则,来适配更高级的格式要求和工业规范。Ruff支持标准的Python配置文件 pyproject.toml,这个大家学过UV的会很眼熟啊。首先,我们想要在默认规则的基础上启用一些额外的规则。那么我们可以添加以下内容:

[tool.ruff.lint]

lint.extend-select = []

这里的extend-select是我们用来扩展Ruff要执行的规则。我们可以在方括号中填入我们希望Ruff检查额外的规则代码。举个例子,Ruff有一个规则是建议用pathlib来代替内建的open()函数。这个规则的代码是PTH。我个人很喜欢使用pathlib,因为它有很多优点,所以我希望在我的项目中强制启用这个规则。lint.extend-select = [“PTH”] 保存这个配置文件后,我们回到脚本重新运行。现在我们看到Ruff检查出新增的一个错误就是PTH123。你可以像我这样做加法一个个对照官方文档去添加,当然也可以全选然后做减法。我们来看看启用所有规则之后我们代码会有多少提醒。我们修改成lint.extend-select = [“ALL”]。我们短短10行代码竟然就有10处格式建议。比如说,这里有一条规则禁止使用print()。这个规则编号是T201。我们可以加ignore = [“T201”]来去除它。运行之后,Ruff不再提示print()是个问题了。

以上介绍的是Ruff的命令行操作和配置,这样大家才能明白编辑器里Ruff执行的到底是什么。那么,大多数人日常工作中都会在编译器里写代码,所以我们主要看看如何在VS Code中安装和设置Ruff这个扩展,别的主流编译器也会提到。这样最大的好处就是,你可以像我这样卸载掉之前用的很多扩展,比如Black、isort、autopep8等等。接下来就很简单,我们打开VS Code的扩展app界面,直接搜索Ruff。然后点击安装,就可以了。接下来就是配置VS Code的settings.json。我已经提前把需要的配置代码准备好了,大家可以按照我这里这么设置,我会把设置贴到下面。

{

  "editor.defaultFormatter": "charliermarsh.ruff",

  "editor.formatOnSave": true,

  "editor.codeActionsOnSave": {

      "source.fixAll": "explicit",

      "source.organizeImports": "explicit"

    },

}

我们来看看效果,必须要重启一下VS Code。可以看到,Ruff按照格式规则把一些代码错误给下划线高亮了。保存脚本之后,还自动格式化了代码,空行被整理了、空格也变得规范了。点击下面命令窗口的 “Problems”界面,我们就可以看到这些错误的完整列表。这些问题正是我们之前在命令行中看到的那些Ruff检查结果。我们直接鼠标点开这些错误代码链接就会自动在浏览器里打开Ruff官方文档,并且跳转到这个规则的解释页面。我觉得这个功能非常实用,能让我们快速学习并修正代码习惯。

另外,我在这里贴一下其他各种主流编译器集成Ruff的方法,方便大伙查阅。

Vim

先安装vim-lsp插件,并在你的 .vimrc 文件中使用以下内容注册。

if executable('ruff')

    au User lsp_setup call lsp#register_server({

        \ 'name': 'ruff',

        \ 'cmd': {server_info->['ruff', 'server']},

        \ 'allowlist': ['python'],

        \ 'workspace_config': {},

        \ })

endif

Sublime Text

请安装 Sublime Text 的 LSP 插件以及 LSP-ruff 插件。

PyCharm

打开“偏好设置”面板,依次进入“工具” > “外部工具”。然后,添加一个新工具ruff,并使用以下配置。

以上差不多就是我对Ruff主要功能的介绍了,详细的信息大家都可以去它官网查询。对于这款工具大伙都去试试看,有什么感受、遇到什么问题,欢迎在评论区告诉我。我是赛博红兔,咱们下期再见!



Leave a comment