概要
git commit時にコードのフォーマット(black, isort)やチェック(flake8, mypy)を実行する。
バージョン情報
- python 3.9.7
- black 22.1.0
- isort 5.10.1
- flake8 4.0.1
- mypy v0.931
- pre-commit 2.17.0
インストール
$ pip install pre-commit black isort flake8 mypy
pyproject.toml ファイルの記述
設定は pyproject.toml
にできるだけまとめて記載する。
[tool.black] target-version = ["py39"] line-length = 120 extend-exclude = ''' /( | tests/data )/ ''' [tool.isort] profile = "black" py_version = 39 line_length = 120 [tool.mypy] python_version = 3.9 mypy_path = "./my_src" [[tool.mypy.overrides]] module = "boto3.*" ignore_missing_imports = true
tool.isortの設定でblackと競合しないようにprofile指定。
tool.mypy.overridesではライブラリ(例としてboto3に対して)のタイプ指定がなくても警告を出さずにスキップする指定を入れている。入れずにライブラリを利用すると下記のようなエラーが出る。
foo.py:8: error: Skipping analyzing "boto3": module is installed, but missing library stubs or py.typed marker
.flake8 ファイルの記述
flake8は pyproject.toml
未対応なので別途 .flake8
ファイルを作成して設定を記述。pyproject.toml用のwrapperもあるのでそちらを使うのも手。
[flake8] ignore=W503,W292,E203 max-line-length=120 max-complexity=20 per-file-ignores= ./tests/foo.py:E402,C901
blackとの競合を避けていくつかの項目を ignore にしている。
max-complexityは超えてしまった場合に #noqa C901
で対応するとblackがnoqaコメントの位置を変えてしまうことがあるので個別に per-file-ignores で無効にしている。
.pre-commit-config.yaml ファイルの記述
gitでコミット前にチェックを走らせる為に .pre-commit-config.yaml ファイルを用意する。
repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.0.1 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-added-large-files - id: check-toml - id: check-yaml - id: check-json - id: detect-aws-credentials - id: detect-private-key - repo: https://github.com/psf/black rev: stable hooks: - id: black - repo: https://github.com/pycqa/isort rev: 5.10.1 hooks: - id: isort - repo: https://gitlab.com/pycqa/flake8 rev: 4.0.1 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.931 hooks: - id: mypy verbose: true entry: bash -c 'mypy -m lib1 -m lib2 || true' --
mypyは複数のモジュールを実行する例としてbashから読んでいる。
pre-commit install
installコマンドで pre-commit
を有効にする。
$ pre-commit install
これでコミット時にblack, isortでコードが整形されて、flake8とmypyでチェックが行われるようになる。
改定履歴
Author: Masato Watanabe, Date: 2022-03-11, 記事投稿