話題
- 参画しているプロジェクトのバックエンド(Flask)のコードがLinterやformatterが導入されておらず苦労した(なお継続中)話
希望
- Githookでlint&formatしたくね??????
問題
- プロジェクト初期に書かれたコードがpep8ガン無視でlint導入したらエラー出まくる
- 一気にautofixかけたいけど、差分が出過ぎてレビューができない。
- 全量リファクタもしたいが工数もないし、テストコードも十分じゃなさそう
妥協
- 新規作成するコードはLint&formatかける。
- 既存コードは一旦そのまま
- 既存コードのテストコードを見直し、追加実装していつでもリファクタできるようにしておく
- hookでLintはかける。formatはにんげんが判断してかける(苦肉の策)。
- 既存は
git commit --no-verify
で無理矢理コミットする
開発方法
新規の場合
- コーディングする
- コミット時にLintが走る
- formaterをかける
black hogehoge.py
- 手で直さなきゃならないとこはエラーがなくなるまで修正してコミット(ファイル指定でlint
flake8 hogehoge.py
) - pushしてプルリクレビューへ
既存コードに手に入れる場合
- コーディングする
- コミット時にLintが走る
- エラーがあれば、
black hogehoge.py --diff
で追記部分のエラーを確認して手で直す。(ファイル指定でlintflake8 hogehoge.py
) - コミットするときは
git commit --no-verify
でhookを飛ばす - pushしてプルリクレビューへ
Linterの設定
linterはflake8を利用する。
pip install flake8
- 設定ファイルを作成(プロジェクトルートに
.flake8
を作る)
.flake8
[flake8]
ignore = E203, E266, E501, W503, F403, F401
max-line-length = 79
max-complexity = 18
select = B,C,E,F,W,T4,B9
※flake8の設定は適宜変えること
- 正直現代でmax-line-length<80は少なすぎ
- igonoreはblackとの関係でE203,W503,W504は必須。それ以外は適宜
- ここ見て
formatterの設定
formatterはblackを使う
pip install black
- 設定ファイルを作成(プロジェクトルートに
pyproject.toml
を作る)
pyproject.toml
[tool.black]
line-length = 79
include = '\.pyi?$'
exclude = '''
/(
\.git
)
'''
flake8と合わせること
- たまにformaterかけたのにエラーになるときあってびっくりする
githookの設定
hookの設定にはpre-commit使います。
pip install pre-commit
- 設定ファイルの作成(プロジェクトルートに
.pre-commit-config.yaml
を設置)
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.4.0
hooks:
- id: flake8
まとめ
- ツールの導入期間なこともあっていびつで手作業が含まれてしまってる。ちょっとずつ変えていく
- linterやformaterは最初に入れる。ルールも最低限のもの(pep8)入れるべき
- 書きづらいなと思った段階でルールを変えていく
- テストコードがちゃんとしてれば既存いじっても基本は問題ない