Python でコードを書く際、可読性と一貫性は非常に重要です。 Flake8, Black, isort を使うことで、コードスタイルを自動的にチェック・修正し、クリーンで読みやすいコードを維持できます。この記事では、これらのツールを組み合わせて使う方法と、そのメリットについて解説します。
1. なぜコードスタイルが重要なのか?
一貫性のあるコードスタイルは、複数人での開発時におけるコードの理解と保守を容易にします。スタイルガイドに従うことで、バグの早期発見や、コードレビューの効率化にも繋がります。
2. 各ツールの役割
- Flake8: PEP 8 (Python のスタイルガイド) への準拠、潜在的なバグ、複雑なコードなどを検出するリンターです。エラーや警告を表示することで、コードの品質向上を支援します。
- Black: 意見の分かれるフォーマットに関する議論をなくすため、コードを自動的にフォーマットするツールです。設定オプションが少なく、一貫したスタイルを強制的に適用します。
- isort: import 文をアルファベット順にソートし、標準ライブラリ、サードパーティライブラリ、ローカルライブラリをグルーピングすることで、import 文の整理整頓を行います。
3. ツールのインストール
pip
を使ってインストールします:
pip install flake8 black isort
4. 設定ファイル (.flake8
, pyproject.toml
)
.flake8
ファイルで Flake8 の設定を、pyproject.toml
ファイルで Black と isort の設定を行うことができます。
.flake8
:
[flake8]
ignore = E203, W503 # 必要に応じて無視するエラーコードを指定
max-line-length = 88 # 行の長さの最大値 (Blackのデフォルトに合わせて88を推奨)
exclude =
.git,
__pycache__
# 除外ファイル
pyproject.toml
:
[tool.black]
line-length = 88
target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] # 対象のPythonバージョン
[tool.isort]
profile = "black" # Blackとの互換性のために"black"プロファイルを指定
multi_line_output = 3 # import文が複数行になる場合のスタイル (3が推奨)
line_length = 88 # Blackに合わせて88に設定
5. Git hooks の活用 (pre-commit)
pre-commit
を使用すると、コミット前に自動的に Flake8, Black, isort を実行し、コードスタイルの問題を修正できます。
pip install pre-commit
pre-commit install
.pre-commit-config.yaml
ファイルに設定を記述します:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 # 最新のタグを使用
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- repo: https://github.com/psf/black
rev: 24.10.0 # 最新のタグを使用
hooks:
- id: black
- repo: https://github.com/pycqa/flake8
rev: 7.1.1 # 最新のタグを使用
hooks:
- id: flake8
- repo: https://github.com/PyCQA/isort
rev: 5.13.2 # 最新のタグを使用
hooks:
- id: isort
6. まとめ
Flake8, Black, isort を導入することで、Python コードのスタイルを自動的に管理し、可読性と一貫性を向上させることができます。これらのツールをワークフローに組み込むことで、よりクリーンで保守しやすいコードベースを構築できます。
この記事が、Python 開発をよりスムーズで効率的なものにする一助となれば幸いです。
付録: 例
整形前のコード:
import requests
import os
import sys
def my_function(a , b):
print( a+ b )
if __name__ == '__main__':
my_function(1 ,2)
print(os.path.abspath(__file__))
整形後のコード:
import os
def my_function(a, b):
print(a + b)
if __name__ == "__main__":
my_function(1, 2)
print(os.path.abspath(__file__))
エディタやpre-commitを活用することで、保存時やコミット時に自動で整形され、常に綺麗なコードを保つことができます。