Ruff:BlackやFlake8を凌駕する「破壊者」がPythonプロジェクトを100倍高速化する

Python tutorial - IT technology blog
Python tutorial - IT technology blog

リンティングとフォーマットにおける「待ち時間」という悩み

大規模なPythonプロジェクトを管理しているなら、こんな光景に見覚えがあるはずです。コードを書き終えて保存ボタンを押し、Blackがコードを再フォーマットするのを3〜5秒間待つ。続いてCI/CDを実行し、Flake8がロジックエラーをチェックするのにさらに数分かかる。

数百ファイル規模のプロジェクトに初めて携わったとき、私はこの待ち時間を当然のことだと思っていました。しかし、本番環境で完全にRuffに移行して半年後、いかに多くの時間を無駄にしていたかに気づきました。Ruffは単なる新しいツールではありません。Rust言語のパワーによって、コード品質を維持する方法を根本から変えてしまうのです。

なぜ既存のツールを捨ててRuffを使うべきなのか?

1. 驚異的な処理速度

Ruffの速さは信じられないほどです。公式のベンチマークによると、Flake8よりも10倍から100倍高速です。実際、約500ファイルのレポジトリでは、Flake8が完了までに約10秒かかるのに対し、Ruffはわずか0.18秒で終わります。Ctrl + Sを押した瞬間にコードが正しいフォーマットに整う感覚は、一度味わうと病みつきになります。

2. すべてを一つに(オールインワン)

以前は、設定ファイルが.flake8pyproject.toml(Black用)、.isort.cfgなど、あちこちに散乱していました。Ruffはこの煩雑さを完璧に解消します。一つのツールだけで、以下の機能を完全に代替できます。

  • Flake8: ロジックエラーとコードスタイルのチェック。
  • Black: 標準に従ったコードの自動フォーマット。
  • isort: インポート文の整理・ソート。
  • pyupgrade: 最新のPython構文への自動アップグレード。

3. インテリジェントな自動修正(Autofix)機能

Ruffはただ指摘するだけではありません。多くの一般的なエラーを自動的に修正する能力を持っています。--fixフラグを追加するだけで、不要なインポートの削除、未使用変数の修正、古い構文からPython 3.10以降への変換などを自動で行います。警告の約80%は、キーボードに触れることなく解消されます。

実プロジェクトへのRuff導入ガイド

導入にあたって、すぐにすべてを削除する必要はありません。まずは以下の手順で、既存のツールと並行して試してみてください。

ステップ1:簡単なインストール

pipやPoetryなどのパッケージマネージャー経由でインストールできます:

pip install ruff

macOSを使用していて、マシン上のすべてのプロジェクトで使用したい場合:

brew install ruff

ステップ2:pyproject.tomlでの集中設定

設定はpyproject.tomlに集約することをお勧めします。これによりプロジェクトが非常にすっきりします。以下は私が実際のプロジェクトで適用している設定セットです:

[tool.ruff]
line-length = 88
target-version = "py311"

[tool.ruff.lint]
# E, F: 基本的なFlake8ルール
# I: isort (インポートの整列)
# B: flake8-bugbear (潜在的なロジックエラーの検出)
# UP: pyupgrade (構文のアップグレード)
select = ["E", "F", "I", "B", "UP", "N"]
ignore = ["E501"] # 長い行の処理はフォーマッターに任せる

[tool.ruff.format]
quote-style = "double"
indent-style = "space"

ステップ3:覚えておくべき主要コマンド

プロジェクト全体のログをスキャンするには、以下を入力します:

ruff check .

スキャンと同時に自動修正(不要なインポートの削除など)を行うには:

ruff check . --fix

そして、コードをフォーマットするには(Blackの完全な代替):

ruff format .

実戦経験:このステップを飛ばさないでください

Ruffの複雑なルール、特に正規表現(Regex)文字列に関するエラーを扱う際のちょっとしたコツです。標準的でない正規表現を書くと、Ruffがエスケープシーケンスのエラーを報告することがあります。私の経験では、コードに組み込む前に toolcraft.app/ja/tools/developer/regex-tester でパターンを素早くテストすることをお勧めします。これにより、エラーが正規表現のロジックにあるのか、それともRuffの設定が厳しすぎるのかを判断できます。

VS Codeに統合して開発をよりスムーズに

Astral公式のRuff拡張機能をインストールしましょう。その後、settings.jsonに以下の記述を追加すると、保存するたびにコードが自動的にクリーンで美しくなります:

{
  "[python]": {
    "editor.formatOnSave": true,
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit",
      "source.organizeImports.ruff": "explicit"
    }
  }
}

GitHub ActionsでCI/CDを最適化

Ruffは非常に軽量なため、パイプラインの実行時間を大幅に節約できます。以下は私がよく使用するスニペットで、プルリクエストごとのチェックがわずか数秒で完了します:

name: Lint
on: [push, pull_request]
jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/ruff-action@v1
        with:
          args: "check ."

結論:今すぐ移行すべきか?

新しいプロジェクトを始めるなら、迷うことはありません。最初からRuffを使いましょう開発環境がクリーンになり、何倍も高速になります。

安定稼働している既存プロジェクトの場合は、段階的に移行できます。Ruffには既存のエラーに無視タグを自動で付与する ruff check --add-noqa コマンドがあります。これを使えば、何千行もの古いコードを手動で修正することなく、すぐにRuffを導入できます。

信じてください。一度Rustのスピードに慣れてしまうと、BlackやFlake8の完了をじっと待っていた頃にはもう戻れなくなりますよ。

Share: