因为我之前是做前端的,ESLint 和 Prettier 这样的工具给稍微有一点强迫症的我留下了很深刻的印象。所以,去年我写 pytorch-lightning-template 的时候去调研了一波 Python 领域的 Linter 和 Formatter 来确保代码质量。第一次发现了 Ruff,也就有了 这篇文章。后来的深入使用中,也确实发现了一些问题。因为当时 Ruff 本身是一个比较新的项目,他的生态并不是很完善,比如说当时还不能格式化代码,需要跟 Black 一起使用,他的 VSCode 插件不支持 Jupyter Notebook,没有 GitHub action,有一些规则还没有实现等等。
现在,经过差不多一年的时间,Ruff 已经脱离的 Beta 阶段,生态基本成型了。所以有了这一篇文章,来介绍一下我心目中的 Ruff 最佳实践
。
如果你不清楚 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)
实现。
注意,除非你需要在命令行运行 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 + F
,Ctrl + Shift + P
等格式化快捷键了。
Ruff 的配置也很简单,支持在 pyproject.toml
或 ruff.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: 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 是 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必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。