iMind Developers Blog

iMind開発者ブログ

git commit時にblack, isort, flake8, mypyでPythonのコードチェック

概要

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, 記事投稿