Skip to content

Ruff 排序 Python 导入

问题说明

当在小型 Python 项目中工作时,开发者经常需要清理和整理代码。传统上使用 isort 工具管理导入语句排序非常流行,但随着 Ruff 的出现,许多开发者希望使用这个现代化工具链替代多款传统工具。

面临的核心问题:
如何在没有配置文件的简单项目中,使用 Ruff 完全替代 isort 的功能来对 Python 导入语句进行排序和格式化?

开发者可能已经知道 ruff format . 能替代 black 格式化代码,但这个命令不会处理导入语句的排序。因此需要找到使用 Ruff 命令来实现 isort 功能的正确方法。

解决方案

要同时实现导入排序和代码格式化,需要组合使用 Ruff 的两个命令:

  1. 排序导入语句
    使用 Ruff 的 lint 功能,特别指定 I 规则集(导入相关规则)并自动修复问题

  2. 格式化代码
    使用标准的 ruff format 命令处理代码风格

完整命令序列

bash
ruff check --select I --fix .  # 排序和清理导入
ruff format .                  # 格式化代码

工作原理解析

  • --select I:专门针对 Ruff 的导入规则分类(I代表Imports)
  • --fix 参数:自动应用可修复的问题,包括导入重排序
  • 双命令顺序:必须先排序后格式化,避免格式调整破坏导入结构

配置说明

最小化配置文件

虽然命令行可直接使用,但添加基本配置能优化行为。创建 ruff.toml:

toml
# ruff.toml
[format]
# 黑名单兼容样式
indent-style = "space"
indent-width = 4

[lint]
# 启用所有推荐规则
select = ["E", "F", "I", "UP"]

注意事项

  1. Ruff 不依赖配置文件运行,上述命令在没有任何配置文件的项目中即刻生效
  2. isort 不同,Ruff 默认遵循 PEP8 的导入排序规范
  3. 执行 --fix 可能产生额外改动(如移除未使用导入),建议先提交代码变更

终端演示

bash
$ ruff check --select I --fix .
Found 5 imports needing reordering (2 fixable)
Fixed 2 import sorting issue
 Done in 0.25s

$ ruff format .
Formatted 3 files
 All files formatted

VS Code 集成配置

在设置中启用自动修复:

json
{
  "editor.codeActionsOnSave": {
    "source.fixAll.ruff": true
  },
  "ruff.lint.args": ["--select", "I"]
}

替代方案对比

传统方案Ruff 方案优势
isort . && black .ruff check --select I --fix . && ruff format .单工具链, 速度快10-100倍
需维护独立配置文件零配置或极简配置降低项目复杂度
分离的依赖项统一工具依赖减少开发环境配置负担

重要差异

  • Ruff 的导入排序逻辑基于类型划分(标准库、第三方、本地)
  • isort 某些定制配置需通过 Ruff 的 [lint.isort] 配置节转换
  • 迁移大型项目前,建议使用 ruff check --select I --diff . 预览变更

总结

通过组合使用 ruff check --select I --fix .ruff format . 两条命令,即可在无配置或极小配置场景下:

  1. 完整替代 isort 的导入排序功能
  2. 获得比传统工具链快10倍以上的执行速度
  3. 实现项目依赖的简化(仅需Ruff)

对于需要深度定制导入规则的项目,参考官方配置文档:Import Sorting - Ruff Docs