[Python] コピペで使える静的解析ツールのセットアップ – isort, black, flake8, mypy

何も考えずにインストール・pyproject.tomlをコピペするだけで使える静的解析ツールの設定をまとめました。

コードチェッカー、型チェッカー、import修正、コードフォーマッターあたりが入ってます。

VSCodeで自動フォーマットする設定はこちらの記事に書いています。

pipを使ってpyproject.tomlに設定を記載する


pipで以下のツールをインストールします。

flake8はpyproject.tomlに設定を書く場合に対応していないのでpyproject-flake8を入れる必要があります。

blackはコード自動フォーマット、isortはimport文の自動フォーマット、pyproject-flake8/flake8はpep8に準拠しているかをチェックするツール、mypyは型チェッカーです。

pip install black isort mypy flake9 pyproject-flake8

pyproject.tomlに静的解析ツールの設定を記載します。設定したルール・内容はコメントの通りです。

基本的にblackは標準のまま、他もblackのパラメータに合わせたり、除外ファイルを指定しているくらいです。

# 自動フォーマット
[tool.black]
# デフォルト設定のままにしている
target-version = ['py310']
# 除外するファイル群
exclude = '''
(\.git|\.mypy_cache|.venv|build|dist|snapshots|snap_)
'''

# import文の順番・形式の修正
[tool.isort]
line_length = 88  # blackのデフォルト値
multi_line_output = 3  # こちらを参考 -> https://pycqa.github.io/isort/docs/configuration/multi_line_output_modes.html
include_trailing_comma = true  # 複数行importしたときに末尾にカンマをつけるかどうか


# pep8に準拠しているかをチェックする
[tool.flake8]
max-line-length = 88  # blackのデフォルト値
max-complexity = 10  # 循環的複雑度の最大値
# 無視するルールをカンマ区切りで指定
ignore = "E203,E266,W503,"
# E203: ":"の前の空白を入れないルール
# E266: コメントアウトのときに"#"を複数使わないようにするルール
# W503: 演算子の前に改行しないようにするルール

# 除外するファイル
exclude = [
  "__pycache__",
  "*/snapshots/snap_test_*"
]

# 型チェッカー
[tool.mypy]
python_version="3.10"

以下のコマンドで実行できます。

isort <フォルダ名>
pflake8 <フォルダ名>
black <フォルダ名>
mypy <フォルダ名>

いちいち何度もコマンド打つの面倒なので、こんな感じのmakefile書いておくとコマンド一発でできて便利です。

make lint
.PHONY: lint
lint:
  isort <フォルダ名>
  pflake8 <フォルダ名>
  black <フォルダ名>
  mypy <フォルダ名>

Poetryの場合


poetryでやる場合でもpyproject.tomlを使うので基本変わりません。

まずはツールのインストール。

開発でしか使わないので-Dオプションつけてるくらいの違いで、pipがpoetryに変わっただけです。

poetry add -D black isort mypy flake8 pyproject-flake8

設定についてはpyproject.tomlに先ほどと同じ内容を追記してください。

以下のコマンドで静的解析実行できます。

poetry run isort <フォルダ名>
poetry run black <フォルダ名>
poetry run pflake8 <フォルダ名>
poetry run mypy <フォルダ名>

makefileはpoetry runにするだけでpipの例とほぼ同じです。

make lint
.PHONY: lint
lint:
	poetry run isort <フォルダ名>
	poetry run black <フォルダ名>
	poetry run pflake8 <フォルダ名>
	poetry run mypy <フォルダ名>

特定の行だけ静的解析を無効にする


mypyは# type: ignoreで指定した行を無視できます。

pflake8は# noqa、blackは# fmt: off, # fmt: onの間のコードが無効になります。

# mypyのチェックを無効にする
x: str = 12  # type: ignore

# pflake8のチェックを無効にする
x = "hogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehogehoge" # noqa


# 以下の部分はblackが無効
# fmt: off
a = 1+    2
# fmt: on

コメントを残す

メールアドレスが公開されることはありません。