何も考えずにインストール・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