数据STUDIO

又一 Python 神奇库 -- Ruff !

Image

Image

你是否曾盯着终端,焦灼地等待 flake8 和 black 跑完一个大型项目?又或者被 isort 和 autoflake 的配置搞得晕头转向?别担心,今天介绍的这款 “All-in-One”神器,能让你彻底告别工具链的臃肿与缓慢。

大家好,我是你们的老朋友。在Python开发中,维护代码风格和质量是一道必答题。但传统的答案——用Flake8检查代码、用Black格式化、用isort排序导入——这套组合拳虽好,却有几个痛点:速度慢、配置散、工具多。

直到我遇见了它——Ruff。一个用Rust写的,号称比现有工具快10-100倍的Python代码“闪电侠”。它不止快,更能一站式完成代码检查(Lint)和格式化(Format),替代你桌面上那一排工具。

Ruff是什么?

Ruff 是一款用 Rust 编写的超高速 Python 代码检查器和格式化工具。它的设计目标是比 Flake8、Black 和 isort 等现有工具快 10 到 100 倍,同时提供统一的代码质量管理界面。Ruff 可以用一个速度极快的解决方案替代包括 Flake8、Black、isort、pyupgrade 和 autoflake 在内的多个工具。

今天,就让我们用一篇文章的时间,彻底掌握这个新时代的Python开发利器。

一、Ruff初体验:快到难以置信的安装与上手

Ruff的核心优势就是快。有多快?官方数据显示,检查像pandas这样庞大的代码库,Flake8需要30秒,而Ruff仅需0.5秒。这种速度意味着你可以在保存文件时实时检查,而无需任何等待。

安装它,只需要一行命令:

# 推荐使用 uv,体验如飞
uv add ruff --dev
# 或者用 pip
pip install ruff

上手更是简单到离谱。 假设我们有一个“脏兮兮”的Python文件 example.py:

# example.py - 一个充满“问题”的示例文件
from typing import Iterable
import os  # 未使用的导入
import sys # 未使用的导入

defsum_even_numbers(numbers: Iterable[int]) -> int:
"""Given an iterable of integers, return the sum of all even numbers."""
return sum(
        num for num in numbers
if num % 2 == 0
    )

unused_var = 42# 定义了但未使用的变量

让我们请Ruff医生来诊断一下:

# 1. 代码检查 (Lint)
ruff check example.py

输出:

example.py:3:8: F401 [*] `os` imported but unused
example.py:4:8: F401 [*] `sys` imported but unused
example.py:11:1: F841 Local variable `unused_var` is assigned to but never used
Found 3 errors.
[*] 2 fixable with the `--fix` option.

看,它精准地找到了未使用的导入和变量。更棒的是,它还提示有2个问题可以自动修复!

# 2. 一键自动修复
ruff check --fix example.py

运行后,os 和 sys 的导入语句被自动删除。修复后的文件清爽多了。

# 3. 代码格式化 (Format)
ruff format example.py

输出:1 file reformatted现在,你的代码不仅正确,而且风格统一(比如自动调整了缩进和换行)。

看,仅仅3条命令,我们就完成了从检查、修复到格式化的全过程。 这效率,是不是像给开发流程装上了涡轮增压?

二、配置化实战:如何为你的项目量身定制?

Ruff的强大之处在于其高度可配置性。它支持 pyproject.toml、ruff.toml 或 .ruff.toml 配置文件,且配置是级联的,非常适合monorepo项目。

一个标准的 pyproject.toml 配置可能长这样:

[tool.ruff]
# 全局设置
line-length = 88          # 和Black默认保持一致
target-version = "py310"  # 你的项目Python版本

[tool.ruff.lint]
# 选择要启用的规则集,Ruff有800+条规则!
select = [
    "E",   # pycodestyle 错误
    "W",   # pycodestyle 警告
    "F",   # Pyflakes (类似未使用变量/导入的核心检查)
    "UP",  # pyupgrade (自动升级Python语法)
    "B",   # flake8-bugbear (常见bug预防)
    "I",   # isort (导入排序,直接替换isort!)
    "C4",  # flake8-comprehensions (推导式优化)
]

# 忽略某些规则
ignore = ["E501"]  # 暂时忽略“行过长”,让formatter处理

[tool.ruff.format]
# 格式化器设置,保持团队风格统一
quote-style = "double"     # 字符串使用双引号
indent-style = "space"     # 缩进使用空格
skip-magic-trailing-comma = false # 保留末尾逗号,便于diff

进阶技巧:按文件/目录配置规则有时候,测试文件或迁移脚本需要特殊照顾,Ruff可以轻松实现:

[tool.ruff.lint.per-file-ignores]
# 在测试文件中允许使用 `assert` (S101规则)
"tests/**/*.py" = ["S101"]
# 在 `__init__.py` 中,未使用的导入可能是对外暴露的API,可以忽略
"**/__init__.py" = ["F401"]

一键迁移: 如果你从 Black + isort + Flake8 迁移过来,Ruff可以无缝接手你的旧配置,让你无痛切换。

三、融入工作流:让Ruff成为你的开发守护神

单独使用命令已经很棒,但将Ruff集成到你的开发环境和CI/CD中,才能发挥最大威力。

1. 编辑器集成(以VS Code为例)安装官方 Ruff 扩展后,在 settings.json 中加入:

{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.organizeImports": "always", // 保存时自动整理导入(用Ruff的I规则)
"source.fixAll": "always"// 保存时自动修复所有可修复问题
        }
    }
}

从此,保存即规范,编码体验行云流水。

2. 预提交钩子(Pre-commit)在 .pre-commit-config.yaml 中配置:

repos:
-repo:https://github.com/astral-sh/ruff-pre-commit
rev:v0.12.8# 使用最新版本
hooks:
# Ruff linting
-id:ruff
args:[--fix]# 提交前自动修复
# Ruff formatting
-id:ruff-format

这样,不规范的代码根本无法被提交到仓库。

3. CI/CD 集成(以GitHub Actions为例)在 .github/workflows/lint.yml 中创建流水线:

name:Lint&Format
on:[push,pull_request]
jobs:
ruff:
runs-on:ubuntu-latest
steps:
-uses:actions/checkout@v4
-name:RunRuff
uses:astral-sh/ruff-action@v1
with:
args:"check --fix ."# 在CI中也可以尝试自动修复
-name:CheckFormatting
run:ruffformat--check.# 检查格式化是否符合要求

确保团队每一次合并请求的代码都是整洁的。

写在最后

Ruff的出现,堪称Python工具链的一次“降维打击”。它用极致的速度和统一的设计,解决了多年以来Python代码质量工具“散、慢、繁”的痛点。

总结一下,它的核心优势:

  1. 极速:Rust赋能,告别等待。
  2. 全能:一统Lint和Format,替换多个工具。
  3. 易用:配置简单,开箱即用,迁移平滑。
  4. 生态友好:完美融入现代开发工作流(编辑器、Git、CI)。

如果你的团队还在为维护复杂的代码质检工具链而烦恼,或者受困于缓慢的检查速度,Ruff无疑是当前最优、最未来的选择。

是时候给你的项目来一次“工具链升级”了。 你尝试过Ruff了吗?在从传统工具迁移的过程中遇到了什么有趣的问题或惊喜?欢迎在评论区分享你的体验!

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage