大一统的 Ruff: All-in-One Linter & Formatter for Python

因为我之前是做前端的,ESLint 和 Prettier 这样的工具给稍微有一点强迫症的我留下了很深刻的印象。所以,去年我写 pytorch-lightning-template 的时候去调研了一波 Python 领域的 Linter 和 Formatter 来确保代码质量。第一次发现了 Ruff,也就有了 这篇文章。后来的深入使用中,也确实发现了一些问题。因为当时 Ruff 本身是一个比较新的项目,他的生态并不是很完善,比如说当时还不能格式化代码,需要跟 Black 一起使用,他的 VSCode 插件不支持 Jupyter Notebook,没有 GitHub action,有一些规则还没有实现等等。

现在,经过差不多一年的时间,Ruff 已经脱离的 Beta 阶段,生态基本成型了。所以有了这一篇文章,来介绍一下我心目中的 Ruff 最佳实践

Ruff 一把梭哈,无脑替换 Black, Flake8, autopep8, isort 等

如果你不清楚 Linter 和 Formatter 的区别,可以先看看我之前写的 这篇文章。Black 问世的时候也是狠狠的风靡了一段时间,我也是用了很久,基本上只需要把默认的最大行宽 line-length 从 80 改成 120 就能很好的符合我的要求。现在 Ruff 重新实现了一版 Black,你只需要把 Black,Flake8,isort,autopep8 等统统删掉,然后安装 Ruff,就可以一键完成上述所有工具的代码格式化了。如果是一个使用 Black 的老项目,Ruff 也宣称他们实现了 对 Black 的 99% 兼容。isort 这样对 import 语句进行排序的工具,则可以用 Ruff 的规则 [I](https://link.zhihu.com/?target=https%3A//docs.astral.sh/ruff/rules/%23isort-i) 实现。

VSCode 插件再升级,支持 Jupyter Notebook 单元格格式化

注意,除非你需要在命令行运行 Ruff,否则完全没有必要在项目中安装 Ruff 依赖(比如 pip install ruff),因为 VSCode 插件自己带了一个独立的 ruff 可执行文件。

还是直接在 VSCode 的插件市场搜索 Ruff (charliermarsh.ruff)下载安装即可。[2023.60.0](https://link.zhihu.com/?target=https%3A//github.com/astral-sh/ruff-vscode/releases/tag/2023.60.0) 版本开始支持对 Jupyter Notebook 单元格格式化。VSCode 配置的话,参考如下

"[python]": {                                        // 仅对 python 文件生效
    "editor.defaultFormatter": "charliermarsh.ruff", // 默认使用 Ruff 格式化
    "editor.formatOnSave": true,                     // 保存时自动格式化
    "editor.codeActionsOnSave": {
        "source.fixAll.ruff": "explicit",            // 保存时自动修复可修复的 lint 错误
        "source.organizeImports.ruff": "explicit",   // 保存时自动排序 import 语句
    }
},
"notebook.formatOnSave.enabled": true,               // notebook 保存时自动格式化
"notebook.codeActionsOnSave": {
    "source.fixAll": true,                           // notebook 保存时自动修复可修复的 lint 错误
    "source.organizeImports": true                   // notebook 保存时自动排序 import 语句
}

这样设置,在平时使用的时候,就只需要记住 Ctrl + S 就可以了,不需要使用 Shift + Alt + FCtrl + Shift + P 等格式化快捷键了。

常用配置与规则

Ruff 的配置也很简单,支持在 pyproject.tomlruff.toml 中配置,这里以 PEP518 推荐的 pyproject.toml 为例

[tool.ruff]
line-length = 120  # 代码最大行宽
select = [         # 选择的规则
    "F",
    "E",
    "W",
    "UP",
]
ignore = ["F401"]  # 忽略的规则

而常见的规则如下:

标识 规则 简介
F pyflakes 提供了一些比较基础的问题检查。
E,W pycodestyle errors, warnings PEP8 检查。
I isort 对 import 语句进行排序。
UP pyupgrade 提示新版本的 Python 语法。
N pep8-naming PEP8 命名规范检查。
PL Pylint 知名静态代码检查器。
PERF pyperf 检测一些性能问题。
RUF Ruff Ruff 社区自己实现的一些规则。

团队协作

如果是多人协作的项目,我们可以设置一些自动工具来确保 Ruff 的规则被遵守。从宽松到严格来说,可以分为三个阶段:

最宽松的是 VSCode 插件推荐,在 .vscode/extensions.json 文件中添加:

{
  "recommendations": [
    "ms-python.python",
    "ms-python.vscode-pylance",
    "charliermarsh.ruff"
  ]
}

这样别人用 VSCode 打开时就会提示安装这些插件,当然他们也有可能不遵守这个隐性规则,或者他们使用的不是 VSCode。你还可以使用 pre-commit,

- repo: https://github.com/astral-sh/ruff-pre-commit
  # Ruff version.
  rev: v0.1.4
  hooks:
    # Run the linter.
    - id: ruff
    # Run the formatter.
    - id: ruff-format

这样每次提交代码的时候,就会自动运行 Ruff 的 linter 和 formatter,如果有错误,就会提示并阻止提交。当然,因为这是在别人的电脑上本地运行的,还是可以跳过他。更严格的方式是使用 CI(Continuous Integration) 工具,这里介绍一下 GitHub Action 的配置,在 .github/workflows/<name>.yml 中,

name: Ruff
on: [push, pull_request]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: chartboost/ruff-action@v1

这样在代码被 push 进仓库或者 PR 合并时,GitHub 会进行一次 Ruff 的检查。

替代 Pylint

Pylint 是 Python 中很流行的 Linter 工具,Ruff 已经提供了部分规则,具体可以去看 Pylint 兼容进度。

和类型检查器之间的关系

像 Mypy, Pyright, Pyre 这样的类型检查器,可以通过类型推断,帮助你找出潜在的类型匹配错误。然而 Ruff 明确表示他们不会提供类型检查的功能。我觉得这也无所谓,因为我尝试打开过 VSCode 的类型检查(由Pylance 插件提供,底层就是 Pyright),Python 的类型系统本身就还在发展过程中,API 不是很稳定,尤其是在使用第三方库的时候,经常会报错。所以个人感觉目前意义还不是很大。

以上就是“大一统的 Ruff: All-in-One Linter & Formatter for Python”的全部内容,希望对你有所帮助。
?
?关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。