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プロジェクトをはじめるたびに行う設定なのでまとめてみました
これで安心してチーム開発ができるようになります!