Python 代码格式化 Ruff 介绍及其使用方法

Ruff 为 v0.1.2 引入了 format 功能。所以现在 Ruff 不仅是一个 linter,而且还是一个格式化程序。在这篇短文中,我们将学习如何使用格式化程序 Ruff, 目前其在 GitHub 收获了 23.8k 的 stars,版本是 0.2.2。

正因为其功能近乎 Flake8 的完整功能(详见 FAQ - Ruff),因此许多人也放心选择使用 Ruff 作为其开发时的 Linter 使用,Ruff 在主要开源项目中得到了非常积极的开发和使用,例如:

什么是 Linter ?

Linter 是一种代码检查工具,可以帮助我们改进代码:包括检查代码中的语法错误、编码风格问题和潜在的漏洞,并提供建议和修正方法。通过使用 Linter 工具,开发者可以快速地发现并修正程序中的错误,提高代码的质量。

Python 常见的 Linter 工具包括 Flake8, Pylint 等等, Linter 已经成为现代软件开发中必不可少的一部分,如果你还没使用过 Linter, 建议从今天起就开始学习如何使用。

The Ruff Formatter

正如文档所述,Ruff 格式化程序是一种极其快速的 Python 代码格式化程序,旨在作为 Black 的直接替代品,作为 ruff CLI 的一部分提供(从 Ruff v0.0.289 开始)。

特点

  • ⚡️ 比现有的 linters(如 Flake8)和格式化器(如 Black)快 10-100 倍
  • 🐍 可通过 pip 安装
  • 🛠️ 支持 pyproject.toml
  • 🤝 与 Python 3.12 兼容
  • ⚖️ 与 Flake8、isort 和 Black 兼容
  • 📦 内置缓存,避免重新分析未更改的文件
  • 🔧 修复支持,用于自动纠错(例如,自动移除未使用的导入项)
  • 📏 内置 700 多条规则,并对流行的 Flake8 插件(如 flake8-bugbear )进行了本地重新实现
  • ⌨️ 与 VS Code 等编辑器集成
  • 🌎 单核友好,具有分层和层叠配置功能

根据 Github 首页的对比,可以看到 Ruff 的快:

安裝

如果您已经安装了以前版本的 Ruff,请在控制台中运行以下命令:

css 复制代码
pip install --upgrade ruff

对于没有安装 Ruff 的人,请运行以下命令:

复制代码
pip install ruff

现在,要在 Python 文件中使用格式化程序功能,我们运行 ruff format /path/to/file.py 命令,它将格式化该文件。

要格式化目录中的所有文件,我们运行 ruff format . 命令。

如果你不想下载,还有一个工作台可以在线体验:Ruff

语法

  1. 要将 Ruff 作为 linter 运行,请尝试以下任一操作:
bash 复制代码
ruff check .                        # 检查当前目录(以及任何子目录)中的所有文件
ruff check path/to/code/            # 对 `/[path]()/[to]()/[code]()`(及任何子目录)中的所有文件进行检查
ruff check path/to/code/*.py        # 检查 `/[path]()/[to]()/[code]()` 中的所有 `.[py]()` 文件
ruff check path/to/code/to/file.py  # 检查 `[file]().[py]()`
ruff check @arguments.txt           # 使用输入文件 Lint,将其内容视为以新行分隔的命令行参数。
  1. 或者,将 Ruff 作为格式化程序运行:
perl 复制代码
ruff format .                        # 格式化当前目录(及任何子目录)中的所有文件
ruff format path/to/code/            # 格式化 `/path/to/code`(及任何子目录)中的所有文件
ruff format path/to/code/*.py        # 格式化 `/[path]()/[to]()/[code]()` 中的所有 `.[py]()` 文件
ruff format path/to/code/to/file.py  # 格式化 `file.py`.
ruff format @arguments.txt           # 使用输入文件格式,将其内容视为以新行分隔的命令行参数。

例子

如果有一个这样的数据:

python 复制代码
log = new_log(tracker["ip_address"], tracker["request_url"], tracker["request_port"],
                      tracker["request_path"], tracker["request_method"],
                      tracker["browser_type"], tracker["operating_system"],tracker["request_time"])

运行检查 ruff format main.py,如下图:

然后通过 ruff format main.py,变成这样一段代码:

又比如 main.py 文件中有这段代码:

python 复制代码
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from routes.users import user_router
from routes.events import event_router
import uvicorn
app = FastAPI()

# Register routes
app.include_router(user_router, prefix="/user")
app.include_router(event_router, prefix="/event")
@app.get("/")
async def home():
    return RedirectResponse(url="/event/")
if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8080, reload=True)

然后,我们运行以下命令:

css 复制代码
ruff format main.py

格式化之后:

python 复制代码
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from routes.users import user_router
from routes.events import event_router
import uvicorn

app = FastAPI()

# Register routes
app.include_router(user_router, prefix="/user")
app.include_router(event_router, prefix="/event")


@app.get("/")
async def home():
    return RedirectResponse(url="/event/")


if __name__ == "__main__":
    uvicorn.run("main:app", host="127.0.0.1", port=8080, reload=True)

自动修复错误(autofix)

Linter 扫描到问题之后,最好是能够自动修复错误,不仅省时也相当省力, Ruff 也支援autofix 的功能,只要加上 参数就--fix能够启用自动修复,例如前述F401 [*] sys imported but unused的问题可以如此修正:

sql 复制代码
$ ruff check --fix test.py

执行结果如下,可以看到Ruff 帮我们修正了1 个错误:

lua 复制代码
$ ruff check --fix test.py 
Found 1 error (1 fixed, 0 remaining).

只要打开 test.py 就可以发现sys已经被删除了。

安装 VS Code Ruff 插件

如果你想省事,就可以直接按照 Ruff 的 VS Code 插件,

结论

Ruff 是一款快速且容易使用的 Python Linter,格式化程序是 Ruff 能够帮助我们编写更具可读性和可维护性的代码。现在,我们有了快速的 linter 和格式化程序。

相关推荐
wan了个蛋4 小时前
使用python脚本大批量自动化处理图片上的ai水印
python
好家伙VCC5 小时前
**TensorFlow:发散创新的深度学习框架探索**随着人工智
java·人工智能·python·深度学习·tensorflow
绝无仅有5 小时前
面试真实经历某商银行大厂Java问题和答案总结(七)
后端·面试·github
YFLICKERH5 小时前
【多进线程】python多进线程与通信
python
绝无仅有5 小时前
面试真实经历某商银行大厂缓存Redis问题和答案总结(一)
后端·面试·github
IT_陈寒5 小时前
Python性能翻倍的5个冷门技巧:从GIL逃逸到内存视图的实战优化指南
前端·人工智能·后端
程序员爱钓鱼5 小时前
Python编程实战 · 基础入门篇 | 第一个Python程序:Hello World
后端·python·编程语言
陈大鱼头6 小时前
摸鱼搭子知乎你怎么了?访问抛出的 525 错误码是什么啊?
运维·后端·http
川石课堂软件测试6 小时前
CSS中常用的几种定位。
开发语言·css·python·网络协议·http·html·pytest