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

863 阅读4分钟

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 的快:

image.png

安裝

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

pip install --upgrade ruff

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

pip install ruff

image.png

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

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

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

语法

  1. 要将 Ruff 作为 linter 运行,请尝试以下任一操作:
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 作为格式化程序运行:
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           # 使用输入文件格式,将其内容视为以新行分隔的命令行参数。

例子

如果有一个这样的数据:

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,如下图:

image.png

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

image.png

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

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)


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

ruff format main.py

image.png

格式化之后:

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的问题可以如此修正:

$ ruff check --fix test.py

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

$ ruff check --fix test.py 
Found 1 error (1 fixed, 0 remaining).

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

安装 VS Code Ruff 插件

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

image.png

结论

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