Skip to content

Python+pre-commitでクソコードを書かせない

Published:

Twitter でクソコードと非難される時代になりました。今回は pre-commit 用いて Python のクソコードを綺麗にします。

使用する Hook は、black、isort、flake8 になります。

pre-commit とは

pre-commit は GitHook スクリプトをコミット前に実行する。つまり、コミット前に自動的に実行できるため、linter やオートフォーマットを自動実行できる。

以下のようなイメージである。
ステージング -> pre-commit -(コーディング規約を遵守していれば)-> コミット

したがってクソコードを強制的にに防ぐことができるようになる。本記事では Python による用途で紹介するが、別のプログラミング言語でも GitHook さえあれば問題ない。

環境構築

Windows10+venv+Python で環境構築する。詳細は、以下の記事を参照。

2022 年 Python 環境構築

virtualenv.exe pre-commit-example
cd pre-commit-example
# 仮想環境にアタッチする。
source Scripts/activate
pip install pre-commit

pre-commit の設定

pre-commit 用の設定ファイルとして.pre-commit-config.yaml、Python プロジェクトファイルのpyproject.tomlを作成する。

touch .pre-commit-config.yaml
touch pyproject.toml

エディタから以下のように追記する。

.pre-commit-config.yaml

repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v3.2.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: 22.3.0
      hooks:
      - id: black
          language: python
          types: [python]
          exclude: ^.*\b(migrations)\b.*$
  - repo: https://github.com/pycqa/isort
      rev: 5.10.1
      hooks:
      - id: isort
          name: isort (python)
          args: ["--profile", "black", "--filter-files"]
  - repo: https://gitlab.com/pycqa/flake8
      rev: 5.0.4
      hooks:
      - id: flake8

データ構成は以下のようになる。

black 用の設定を追記する。

pyproject.toml

[tool.black]
    py310 = true
    line-length = 80
    include = '\.pyi?$'
    exclude = '''
    /(
        \.git
      | \.hg
      | \.mypy_cache
      | \.tox
      | \.venv
      | _build
      | buck-out
      | build
      | dist
      | doc
    )/
'''

以下のコマンドで準備完了です。

pre-commit install

クソコードを commit してみる

以下のようなコードをコミットする。

import sys
import black
import os

a =1
print("test"  )
git commit -m ""

すると以下のようにコミットされずにコマンドが終了した。

pre-commit-result

ちなみに以下のコマンドで commit する前にチェックすることができる。

pre-commit run

この時点で、自動でファイルが整形されている。

format-by-pre-commit

まとめ

pre-commit はいいぞ

https://amzn.to/3DdhVNY