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 和格式化程序。

相关推荐
陈随易12 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
卷无止境13 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库
后端·python
小Z先生13 小时前
我用 Go + 系统 WebView 写了个纯本地 Postman:不装 Electron、不连云端
后端·github
IT_陈寒14 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
灿飞屋14 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
benchmark_cc14 小时前
单只股票五档盘口接入个人研究仓库:QuantDash 读取、校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
石小石Orz14 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
陈随易14 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
量化分析码农15 小时前
【Python量化波动率实战 04】低波动异象:低波组真的跑赢高波组吗
后端
风上猫15 小时前
MySQL多值索引:让 JSON 数组也能走索引(以及 6 个容易踩的坑)
后端