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
语法
- 要将 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,将其内容视为以新行分隔的命令行参数。
- 或者,将 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 和格式化程序。