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

相关推荐
极梦网络无忧9 小时前
OpenClaw 基础使用说明(中文版)
python
codeJinger9 小时前
【Python】操作Excel文件
python·excel
XLYcmy10 小时前
一个针对医疗RAG系统的数据窃取攻击工具
python·网络安全·ai·llm·agent·rag·ai安全
Islucas10 小时前
Claude code入门保姆级教程
python·bash·claude
萝卜白菜。10 小时前
TongWeb7.0相同的类指明加载顺序
开发语言·python·pycharm
赵钰老师10 小时前
【ADCIRC】基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟实践技术应用
python·信息可视化·数据分析
爬山算法11 小时前
MongoDB(80)如何在MongoDB中使用多文档事务?
数据库·python·mongodb
YuanDaima204811 小时前
基于 LangChain 1.0 的检索增强生成(RAG)实战
人工智能·笔记·python·langchain·个人开发·langgraph
nbwenren11 小时前
Springboot中SLF4J详解
java·spring boot·后端