使用 Ruff 进行 Python 代码格式化与静态检查

随着 Python 项目的规模增大,保持一致的代码风格和高质量的代码变得尤为重要。Ruff 是一个现代、高性能、支持 lint 和格式化的 Python 工具,能帮助你快速发现并修复常见代码问题。

本文将介绍:


  • Ruff 的作用与工作原理
  • 如何安装与配置 Ruff
  • VSCode 等开发环境中的集成方式
  • 常用参数说明
  • 配置案例

1. 什么是 Ruff?

Ruff 是由 Astral 团队开发的一个 Python 静态检查器和格式化器,主打:

  • 速度极快(使用 Rust 编写)
  • 功能全面:集成 Flake8、isort、pycodestyle、autoflake、pylint 等常见工具的规则
  • 自动修复:支持大部分问题自动修复
  • 代码格式化:可以替代 Black 进行统一格式化

2. 安装 Ruff

使用 pip 安装 Ruff(建议加到开发依赖):

pip install ruff

3. Ruff 的工作原理

Ruff 的工作主要分为两个阶段:

阶段

命令

功能

Lint 检查(静态分析)

ruff check

分析代码错误、风格问题(未使用变量、导入顺序等)

自动格式化

ruff format

格式化代码(缩进、引号风格、括号等)

其中:

  • ruff check . --fix 可以自动修复大部分 lint 问题,包括删除未使用 import、合并重复导入等。
  • ruff format . 主要用于统一格式,不会做“语义删除”(比如不会删未使用 import)。

4. 项目结构建议

css


复制编辑
your_project/
├── pyproject.toml        ← Ruff 配置写在这里
├── .vscode/
│   └── settings.json     ← VSCode 编辑器配置
├── src/
│   └── main.py
└── tests/
    └── test_main.py

5. 配置 Ruff(pyproject.toml)

在项目根目录创建或编辑 pyproject.toml,加入以下内容:

[tool.ruff]
line-length = 88                  # 最大行长度
target-version = "py38"          # Python 目标版本
src = ["src", "tests"]           # 源码路径

[tool.ruff.lint]
select = ["E", "F", "I", "W"]     # 开启的规则类型
ignore = ["E501"]                # 忽略某些规则(如行太长)
fixable = ["ALL"]                # 允许自动修复的规则

[tool.ruff.format]
quote-style = "double"           # 使用双引号
indent-style = "space"           # 使用空格缩进

select常见规则分类:

规则代码

说明

E

pycodestyle(代码风格)

F

pyflakes(错误检测)

I

import 排序(类似 isort)

W

警告信息(如未使用变量)

6. 集成 VSCode

在 .vscode/settings.json 中配置如下,实现“自动保存时格式化 + 实时 lint”:

{
  "files.autoSave": "afterDelay",
  "files.autoSaveDelay": 1000,
  "editor.formatOnSave": true,

  // 使用 Ruff 格式化器
  "python.formatting.provider": "ruff",

  // 启用 Ruff lint
  "python.linting.enabled": true,
  "python.linting.ruffEnabled": true,
  "python.linting.ruffArgs": ["--fix"],

  // 保存时执行所有修复操作
  "editor.codeActionsOnSave": {
    "source.fixAll": true
  }
}

7. 常用命令总结

命令

功能

ruff check .

检查代码(不修复)

ruff check . --fix

检查并修复问题(推荐日常使用)

ruff format .

格式化代码(等价于 Black)

原文链接:,转发请注明来源!