コードの見た目やインポート順序がまちまちなプロジェクトは、メンテナンス性が下がり、レビューも難しくなります。
そこで活躍するのが自動整形や静的チェックのツールです。
本記事ではBlack・flake8・isortの基本、導入手順、設定、そしてVS Code連携までを、Python初心者でも迷わないように丁寧に解説します。
Pythonの自動整形と静的チェックの基本
Pythonにはコード品質を高めるためのツールがいくつか存在します。
ここではBlack・flake8・isortの役割を明確にし、全体像を掴んでいただきます。
Blackとは
Blackは「妥協のない」自動フォーマッタです。
スタイルの選択肢を極力排し、常に同じルールでコードを整形します。
これによりレビューで見た目の議論が減り、ロジックに集中できます。
基本的な特徴は次の通りです。
Blackはpyproject.toml
の[tool.black]
に設定を書きます。
- 主な効能はコードレイアウトの統一です。
- デフォルトの行長は
88
で、line-length
で変更可能です。 --check
や--diff
で差分確認だけを行えます。
flake8とは
flake8は静的解析(コード規約や潜在的なバグの兆候の検出)を行うツールです。
PEP 8準拠のチェックに加え、様々なプラグインで機能拡張が可能です。
設定は.flake8
、setup.cfg
、tox.ini
などで行います。
- 余分なインポート、未使用変数、複雑度などを検出できます。
- エラーコード(E、W、F、C など)で指摘内容が分類されます。
- Blackと競合しやすいチェックは
extend-ignore
で抑止します。
isortとは
isortはインポート文の並べ替えと分割を自動で行います。
標準ライブラリ、サードパーティ、ローカルモジュールなどのグループに分け、アルファベット順で整列します。
設定はpyproject.toml
の[tool.isort]
などに書きます。
- Blackと合わせる場合は
profile = "black"
を設定して衝突を避けます。 isort --check-only
で整形の必要性だけを確認できます。
3つを併用する理由
役割が明確に異なるからこそ、組み合わせることで強力になります。
Blackはフォーマット、isortはインポート、flake8は静的チェックを担当します。
見た目を自動化し、規約違反を早期に検出することで、レビューのノイズを減らし、品質を保ちながら開発速度を上げられます。
以下の表は役割の違いを簡潔にまとめたものです。
ツール | 主な役割 | 自動修正 | 代表的な設定場所 | 例コマンド |
---|---|---|---|---|
Black | コード整形 | あり | pyproject.toml([tool.black]) | black . / black --check . |
isort | インポート順整形 | あり | pyproject.toml([tool.isort]) | isort . / isort --check-only . |
flake8 | 静的解析(規約・バグ兆候) | 一部(基本は指摘のみ) | .flake8、setup.cfg、tox.ini | flake8 |
flake8は原則自動修正しません。
指摘に沿って自分で直すか、Blackやisortで直せる部分はツールに任せます。
導入手順
前提
Python 3.8以上を推奨します。
Windows、macOS、Linuxいずれでも利用できます。
複数プロジェクトで異なるバージョンのツールを使い分けるため、各プロジェクトごとに仮想環境(venv)を作ることをおすすめします。
pipでBlack/flake8/isortをまとめてインストール
既存プロジェクトにまとめて導入する最小手順を示します。
まずはプロジェクトのルートに移動し、必要なら仮想環境を有効化してから以下を実行します。
# 例: すでに仮想環境が有効な状態でインストール
pip install --upgrade black flake8 isort
インストール後はblack
・flake8
・isort
コマンドが使えるようになります。
仮想環境(venv)での導入のすすめ
プロジェクトごとの独立性を保つためにvenvを使います。
OSごとの基本コマンドは次の通りです。
# 1) 仮想環境の作成
python -m venv .venv
# 2) 仮想環境の有効化
# macOS/Linux:
source .venv/bin/activate
# Windows (PowerShell):
.venv\Scripts\Activate.ps1
# 3) ツールのインストール
pip install --upgrade black flake8 isort
仮想環境をプロジェクト直下(.venv)に置くと、エディタ設定やCIで参照しやすくなります。
設定ファイルの最小例
pyproject.tomlにBlackを設定
Blackはpyproject.toml
の[tool.black]
セクションに設定を書きます。
最小構成の例です。
# pyproject.toml
[tool.black]
line-length = 100 # 行の最大文字数(デフォルト88)
target-version = ["py38"] # 目標とするPythonバージョン
skip-string-normalization = true # 既存のクォートを尊重する
line-lengthはプロジェクトの規模や周辺ツールと合わせて決めるとよいでしょう。
pyproject.tomlにisortを設定
isortはBlackと組み合わせるためにprofile = "black"
を指定するのが定石です。
# pyproject.toml
[tool.isort]
profile = "black" # Blackと整合する設定をまとめて適用
line_length = 100 # Blackと同じ値に合わせる
multi_line_output = 3 # 長いインポートの折り返しスタイル
include_trailing_comma = true
これにより、Blackとisortの改行やカンマに関するルールが一致します。
.flake8で基本設定
flake8は.flake8
に設定を書くのが分かりやすいです。
Blackと衝突しやすいルールを抑止し、行長はBlackに合わせます。
# .flake8
[flake8]
max-line-length = 100
extend-ignore =
E203, # Blackと相性が悪い: スライス前の空白
W503, # Blackと相性が悪い: 演算子前の改行
exclude =
.venv,
build,
dist,
per-file-ignores =
tests/*: D # 例: テストではdocstring関連の警告(D*)を緩めたい場合
プロジェクト方針に合わせて、未使用インポート(F401)などの扱いも調整します。
設定ファイルの置き場所と優先順
Blackはpyproject.toml
のみを読み、カレントディレクトリから親ディレクトリへ探索します。
コマンドライン引数が最優先です。
isortはpyproject.toml
、.isort.cfg
、setup.cfg
などを探し、現在のディレクトリに近い設定が優先されます。
こちらも--profile
などのCLI指定が最優先です。
flake8は.flake8
、setup.cfg
、tox.ini
を探索します。
同名ファイルが複数ある場合は、より近いディレクトリの設定が優先され、最終的にはコマンドラインオプションが上書きします。
設定の重複があると混乱の元です。
原則としてBlackとisortはpyproject.toml、flake8は.flake8にまとめるのがシンプルです。
使い方と運用
ここからは実際のコマンドや、既存プロジェクトを一括整形する流れ、VS Code連携を解説します。
Blackの基本コマンド例
Blackはプロジェクトルートで実行します。
# すべてのPythonファイルを整形
black .
# 整形が必要かどうかのチェックのみ(CIで便利)
black --check .
# 変更内容の差分だけ表示
black --diff .
reformatted app/main.py
reformatted tests/test_app.py
All done! ✨ 🍰 ✨
2 files reformatted.
flake8の基本コマンド例
flake8は指摘を標準出力に表示します。
# プロジェクト全体をチェック
flake8
# ディレクトリやファイルを指定
flake8 app/ tests/
app/main.py:10:1: F401 'json' imported but unused
app/utils.py:45:80: E501 line too long (120 > 100 characters)
isortの基本コマンド例
isortはインポートを整えます。
Blackと同様にチェックモードもあります。
# すべてのPythonファイルのインポート順を整形
isort .
# 整形が必要かチェックのみ
isort --check-only .
Fixing app/main.py
Skipped 1 files
既存プロジェクトを一括整形する手順
まずisort→Black→flake8の順で進めると効率が良いです。
最初にisortでインポートを整えてから、Blackで全体レイアウトを統一します。
最後にflake8で残った警告を洗い出し、必要に応じて修正します。
大きめのプロジェクトなら、作業の途中で小さくコミットすると差分の追跡が容易になります。
- 例: isortとBlackを適用し、コミット。続けてflake8の指摘を修正し、再度コミットといった段階的な進め方が安全です。
サンプルコードでのデモ
以下は、isortやBlack適用前の少し乱れたコードです。
# sample_before.py
# 少し乱れたスタイルのサンプルスクリプト
import os,sys
import json
from datetime import datetime, date
def greet(name:str)->str:
# インデントやスペースの使い方、クォートなどが不統一
now=datetime.now()
return f"Hello, {name}! Today is {date.today()} at {now.strftime('%H:%M:%S')}"
if __name__=='__main__':
# 未使用のjsonがあるなど、flake8が指摘します
print(greet("Tools"))
isortとBlackを適用した後のコードは次のようになります。
isort sample_before.py
black sample_before.py
# sample_before.py (整形後)
# スタイルが統一され、インポートも整理されます
from datetime import date, datetime
import os
import sys
def greet(name: str) -> str:
now = datetime.now()
return f"Hello, {name}! Today is {date.today()} at {now.strftime('%H:%M:%S')}"
if __name__ == "__main__":
print(greet("Tools"))
このスクリプトを実行すると、次のような出力になります。
python sample_before.py
Hello, Tools! Today is 2025-09-21 at 12:34:56
実行結果の日時部分は実行時刻に依存して変わります。
flake8を実行すると、未使用のインポート(osやsys)が指摘されることがあります。
不要であれば削除しましょう。
VS Codeで保存時にBlack/isortを有効化
VS Codeでは拡張機能を使うと、保存時に自動整形できます。
以下を推奨します。
- 拡張機能をインストール:
- Python(ms-python.python)
- Black Formatter(ms-python.black-formatter)
- isort(ms-python.isort)
ワークスペースの.vscode/settings.json
に次の設定を追加します。
{
// Blackを既定のフォーマッタにする
"editor.defaultFormatter": "ms-python.black-formatter",
// 保存時に自動フォーマット
"editor.formatOnSave": true,
// 保存時にisortでインポートを整理(明示的に許可)
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit"
},
// 仮想環境を自動検出しやすくする(推奨)
"python.defaultInterpreterPath": ".venv/bin/python"
}
Windowsの場合のpython.defaultInterpreterPath
は.venv\Scripts\python.exe
に読み替えてください。
これで保存時にisortがインポートを整理し、Blackがコードを整えます。
VS Codeでflake8を有効化
flake8は専用拡張機能の導入をおすすめします。
- 拡張機能: Flake8(ms-python.flake8)
基本的には拡張機能が有効化されれば動作しますが、必要に応じてワークスペース設定で引数やパスを指定できます。
{
// 仮想環境内のflake8を使うためのパス指定(必要な場合)
"flake8.path": [
".venv/bin/flake8"
],
// flake8に追加で渡す引数(設定ファイルで十分なら不要)
"flake8.args": [
"--max-line-length=100"
]
}
ルールの詳細は基本的に.flake8に集約し、VS Code側では最小限の上書きに止めると一貫性が保てます。
以下は、より実務で役に立つ運用上のコツです。
- CIでは
isort --check-only .
、black --check .
、flake8
の順で検証すると、失敗理由が把握しやすいです。 - チーム開発では全員が同じ設定ファイルを共有しましょう。エディタ依存の設定は
.vscode/settings.json
としてリポジトリに含めると迷いが減ります。 - 初回整形は大きな差分が出るため、事前に専用コミット1回でまとめると、以降のレビューが楽になります。
まとめ
本記事では、Blackによるコード整形、isortによるインポート整形、そしてflake8による静的チェックを、導入から設定、VS Code連携まで一通り解説しました。
ポイントは、役割を分担させ、共通の設定(pyproject.tomlと.flake8)で一貫性を保つことです。
isort→Black→flake8の順で適用し、保存時自動整形とCIのチェックを組み合わせれば、見た目の議論をなくし、品質を維持しながら開発速度を上げることができます。
まずは最小設定から始め、プロジェクトに合わせて少しずつ調整していきましょう。