🔥

Flake8 から Ruff への移行

2025/02/08に公開

はじめに

Python の静的解析ツールとして長年利用されてきた Flake8 ですが Ruff へ移行することで、圧倒的な処理速度と多機能な Linter & Formatter の恩恵を受けることができます

本記事では、Flake8 から Ruff へ移行するメリットや移行方法を紹介します。

Flake8 との比較

Flake8 の特徴と制限

Flake8 は、Python の Linter(静的解析ツール)として広く使われています。しかし、以下のような制限があります。

  • Lint 機能のみ(コード整形や import の自動整理はできない)
  • 複数のプラグインを追加しないと機能が不足するisort, black などと組み合わせが必要)
  • 処理速度が遅い(特に大規模なプロジェクトでの実行時間が長い)

Ruff の特徴

Ruff は Rust で実装された超高速な Linter & Formatter です。Flake8 と比べて以下のようなメリットがあります。

  • 圧倒的な速度(Flake8 の 10~100 倍速)
  • Linter + Formatter + import 順の整理が 1 つで完結
  • Flake8 のプラグイン機能を標準でカバー
  • pyproject.toml に設定を統一可能

Ruff の導入手順

1. インストール

まず、Ruff をインストールします。

pip install ruff

2. Flake8 の代わりに Ruff を使用する

Flake8 を使用していた場合、以下のように Ruff に置き換えます。

# Flake8
flake8 .

# Ruff(Linter)
ruff check .

Ruff はデフォルトで Flake8 のルールセットをカバーしているため、基本的に ruff check を実行するだけで同様の Lint 結果が得られます。

Ruff の使い方

1. コードの静的解析(Lint)

ruff check .

2. 自動修正

ruff check --fix .

3. コードフォーマット

Ruff は black のようにコードの整形も可能です。

ruff format .

4. Import の自動整理

Ruff は isort のように import 文の順番も整理できます。

ruff check --select I --fix .

VSCode で Ruff を使う

Ruff を VSCode のフォーマッターとして設定すると、保存時に自動整形できます。

1. settings.json に設定を追加

{
  "editor.defaultFormatter": "charliermarsh.ruff",
  "editor.formatOnSave": true
}

2. Python のフォーマッターとして Ruff を明示

{
  "python.formatting.provider": "none",
  "editor.defaultFormatter": "charliermarsh.ruff",
  "editor.formatOnSave": true
}

これで、保存時に ruff format が実行されるようになります。

.flake8 から pyproject.toml への移行

Flake8 の設定を pyproject.toml に統合することで、より管理しやすくなります。

[lint]
line-length = 88
select = ["E", "F", "I"]  # Flake8 互換のルールを適用
fix = true  # 自動修正を有効化

これにより、Flake8 の .flake8setup.cfg なしで Ruff の設定を一元管理できます。

Flake8 とのパフォーマンス比較

実際に Ruff の速さを体感してみましょう。

time flake8 .
time ruff check .

大規模プロジェクトで比較すると、Flake8 より Ruff の方が 10 倍以上高速なことが分かります。

まとめ

  • Flake8 から Ruff に移行すると、Lint・フォーマット・import 整理が 1 つで完結!
  • Flake8 + isort + black の代替として Ruff を使うと管理が楽になる!
  • VSCode でも Ruff を設定すれば保存時に自動整形できる!
  • 圧倒的な処理速度で開発のストレスを軽減!

今後のプロジェクトでは、Ruff への移行を検討してみてはいかがでしょうか? 🚀

Discussion