Python のコード整形・静的解析ツールを整理する:isort / Black / Ruff / Pylance / Flake8
Python プロジェクトでは「フォーマッター」「リンター」「型チェッカー」と呼ばれるツールが乱立していて、名前だけでは何をしてくれるのか分かりにくいです。ここでは代表的な isort・Black・Flake8・Pylance・Ruff の5つについて、①どのカテゴリに属するのか ②カテゴリごとに何を解決するのか ③実際どう組み合わせるのか、という順番で整理します。
1. まず3つのカテゴリに分けて考える
Python のコード品質まわりのツールは、大きく3種類に分けられます。
| カテゴリ | 解決すること | 書き換えるか |
|---|---|---|
| フォーマッター(整形) | コードの見た目(改行・インデント・クォート・import 順序など)を、決まったルールで自動的に揃える | する |
| リンター(静的解析) | バグの温床になりやすい書き方(未使用 import、未定義変数、危険な比較など)を検出して警告する | しない |
| 型チェッカー | 型ヒントをもとに、実行前に型の不整合を検出する | しない |
この5つのツールを、上の3カテゴリに当てはめると次のようになります。
| ツール | 属するカテゴリ |
|---|---|
| isort | フォーマッター(import 順序専門) |
| Black | フォーマッター(コード全体) |
| Flake8 | リンター |
| Pylance | 型チェッカー寄り(エディタの言語サーバー) |
| Ruff | 上記3カテゴリのうちフォーマッター・リンターの大部分を1ツールで肩代わり |
つまり isort と Black は「フォーマッター」、Flake8 は「リンター」、Pylance は「型チェッカー」寄り、Ruff は特定の1カテゴリではなく複数カテゴリにまたがって代替する、という関係になっています。
2. 各ツールの役割解説
フォーマッター系
isort — import 文の並び順を整えるだけの専用フォーマッターです。標準ライブラリ/サードパーティ/自プロジェクト内モジュールをグループ分けし、アルファベット順に並べ替えます。Black と組み合わせて使われることが多く、「コードの中身は Black、import の順番は isort」という役割分担が定番でした。
Black — 「意見を挟まない(opinionated)」フォーマッターとして有名で、行の折り返し・クォートの統一(基本ダブルクォート)・末尾カンマなど、ほぼ設定項目を持たずに一意な整形結果を出します。設定でチーム内の議論(タブかスペースか、クォートはどちらか等)を終わらせることを目的に作られたツールです。整形専任で、バグ検出は行いません。
リンター系
Flake8 — PEP8(コーディング規約)違反や、未使用 import・未使用変数、複雑度が高すぎる関数などを検出する伝統的なリンターです。それ自体は薄いラッパーで、実体は pyflakes(バグ検出)+ pycodestyle(PEP8 チェック)+ mccabe(複雑度計測)というプラグイン構成になっています。Flake8 自身はコードを書き換えません(自動修正機能なし)。
型チェッカー
Pylance — VS Code 用の Python 言語サーバーで、Microsoft 製の型チェッカー Pyright をベースにしています。エディタ上でのコード補完・定義ジャンプ・型ヒントの不整合検出・ホバー時の型情報表示などをリアルタイムに提供します。CI で実行する類のツールというより、エディタ体験(DX)を支えるツールという位置づけです。
カテゴリを横断する統合ツール
Ruff — Rust 実装の高速な静的解析・整形ツールで、Flake8 本体および数十種類の Flake8 プラグイン、isort、(一部)pyupgrade などのルールセットを1つのバイナリで再実装しています。ruff check でリント(Flake8 相当)、ruff format で Black 互換のフォーマットが行える上、--fix で多くの指摘を自動修正できます。「フォーマッター」と「リンター」の2カテゴリを、圧倒的な実行速度でほぼ1本に統合できるのが最大の特徴です(型チェックは対象外)。
3. 比較表
| ツール | 種別 | 主な仕事 | 自動修正 | 実行速度 | 型チェック |
|---|---|---|---|---|---|
| isort | フォーマッター | import 順序の整理 | あり | 速い | なし |
| Black | フォーマッター | コード全体の整形 | あり | 普通 | なし |
| Flake8 | リンター | PEP8/バグの疑いを検出 | なし | 普通 | なし |
| Pylance | 言語サーバー/型チェッカー | エディタ補完・型検証 | 一部(Quick Fix) | 速い(常駐) | あり(Pyright) |
| Ruff | リンター+フォーマッター | Flake8+isort 相当を高速に代替 | あり | 非常に速い | なし |
4. どう組み合わせるか
- 新規プロジェクトで最短構成にしたい → Ruff 単体(
ruff format+ruff check --fix)でフォーマット・import 整理・大半の Lint ルールをカバーできる。CI もエディタ保存時も同じルールで完結する。 - 既存プロジェクトが Black + isort + Flake8 で構築済み → 無理に置き換えず、Ruff の Flake8/isort 互換ルールで段階的に移行するのが安全(挙動差分が出るルールもあるため)。
- 型の堅牢性を上げたい → Ruff や Flake8 は型チェックをしないため、Pylance(エディタ)や
pyright/mypy(CI)を別途組み合わせる。 - エディタでの快適さが目的 → Pylance は CLI で完結する他のツールと違い、エディタに常駐して補完・ジャンプ・ホバー情報を提供するもので、CI 用の Lint とは目的が異なる。CI には Ruff や mypy を別途組み込む。
まとめ
「フォーマットと大半の Lint は Ruff 一本化」「型チェックは Pylance(エディタ)+ mypy/pyright(CI)」という組み合わせが、2026年時点でのシンプルかつ高速な標準構成になっています。