andmohiko

11/19/2022

Pythonでcommit時にlintのチェックをする

JavaScriptにESLintやPrettierがあるように、PythonはFlake8とautopep8というlinterとformatterがあります

今回はこちらを設定していき、commit時にlintのチェックを走らせようと思います

linter・formatterとは

混同されがちなlinterとformatterですが、役割が違います

linterはコードがベストプラクティスに沿っているかどうかをチェックするツールで、例えばPythonならbooleanは == ではなく is で比較するなどをチェックしてくれます

formatterはコードのスタイルをチェックするツールで、例えばスペースの数, 改行の位置, コメントの書き方などをチェックしてくれます

このように役割は違いますが、どちらも目的は同じで、統一的な書き方をすることで品質向上, レビューコストの削減をすることが目的です

Pythonのlinterとformatter

今回はFlake8というlinterと、autopep8というformatterを使います

PythonにはPEP8という標準のコーディング規約があります。チーム開発するときにもよく基準にされている気がします

Flake8とautopep8はこのPEP8に準拠してコードのチェックを行います

作業していく

LinterとFormatterの設定

LinterとFormatterを入れます。パッケージ管理にはpoetryを使います

$ poetry add flake8 -D
$ poetry add autopep8 -D

もし必要があればエディタでlinterとformatterの設定をしてください

これでPEP8に沿っていない書き方をしたらエディタが怒ってくれるようになります

commit時にチェックする

ここまで設定するとエディタは怒ってくれますが、怒られを無視することもできてしまいます

そこで、Gitのcommit時にlintとformatを走らせ、整形されたコードのみpushできるようにします。

Pythonにはpre-commitというGitのpre-commitフックスクリプトを管理・メンテナンスするためのツールがあります。今回はこちらを使っていきます

こちらも普通にpoetryでinstallできます

$ poetry add pre-commit -D

インストールできたらpre-commitの設定ファイルを作成します。次のコマンドでファイルを作成します

$ poetry run pre-commit sample-config > .pre-commit-config.yaml

設定ファイルの中身を書いていきます

autopep8とflake8のhookがあるためこちらを指定します

// .pre-commit-config.yaml

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/mirrors-autopep8
    rev: v1.5.7
    hooks:
    -   id: autopep8
-   repo: https://github.com/pycqa/flake8
    rev: 3.9.2
    hooks:
    -   id: flake8

設定ファイルができたら最後にinstallを実行します

$ pre-commit install

これで試しになにかをcommitしてみると、

autopep8.................................................................Passed
flake8...................................................................Failed
- hook id: flake8
- exit code: 1

というようにちゃんと怒ってくれました

さいごに

新しいPythonプロジェクトをはじめるたびに行う設定なのでまとめてみました

これで安心してチーム開発ができるようになります!