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

相关推荐
武藤一雄1 分钟前
C# 关于多线程如何实现需要注意的问题(持续更新)
windows·后端·microsoft·c#·.net·.netcore·死锁
月疯3 分钟前
各种信号的模拟(ECG信号、质谱图、EEG信号),方便U-net训练
开发语言·python
小鸡吃米…1 小时前
机器学习中的回归分析
人工智能·python·机器学习·回归
程序新视界1 小时前
为什么不建议基于Multi-Agent来构建Agent工程?
人工智能·后端·agent
AC赳赳老秦1 小时前
Python 爬虫进阶:DeepSeek 优化反爬策略与动态数据解析逻辑
开发语言·hadoop·spring boot·爬虫·python·postgresql·deepseek
Victor3561 小时前
Hibernate(29)什么是Hibernate的连接池?
后端
Victor3561 小时前
Hibernate(30)Hibernate的Named Query是什么?
后端
浩瀚之水_csdn1 小时前
Python 三元运算符详解
开发语言·python
源代码•宸2 小时前
GoLang八股(Go语言基础)
开发语言·后端·golang·map·defer·recover·panic
czlczl200209252 小时前
OAuth 2.0 解析:后端开发者视角的原理与流程讲解
java·spring boot·后端