Python コードは Black を通して綺麗にしよう
December 20, 2021
株式会社 ACCESS Advent Calendar 2021 12 月 20 日の記事です。
あまり時間が取れず、小ネタとなります。
Black を使って、Python コードを綺麗にしまし ょうという記事です。
Black とは何か
Black is a PEP 8 compliant opinionated formatter with its own style.
(Ref: https://black.readthedocs.io/en/stable/the_black_code_style/index.html)
Python のフォーマッタです。適当に書いたコードを、整形してくれる便利なやつです。
PSF (Python Software Foundation) が開発しています。
PEP 8 に準拠した コードスタイルに整形します。PEP (Python Enhancement Proposal) 8 は、PSF によって作成された Python コードのスタイルガイドです。
現時点で Black は、まだ beta 版という扱いではあ りますが、多くの著名なライブラリでの利用実績があります。
pytest, tox, Pyramid, Django Channels, Hypothesis, attrs, SQLAlchemy, Poetry, PyPA applications (Warehouse, Bandersnatch, Pipenv, virtualenv), pandas, Pillow, Twisted, LocalStack, every Datadog Agent Integration, Home Assistant, Zulip, Kedro, and many more.
なぜ Black を使うのか
By using Black, you agree to cede control over minutiae of hand-formatting. In return, Black gives you speed, determinism, and freedom from pycodestyle nagging about formatting. You will save time and mental energy for more important matters.
Black makes code review faster by producing the smallest diffs possible. Blackened code looks the same regardless of the project you’re reading. Formatting becomes transparent after a while and you can focus on the content instead.
(Ref: https://black.readthedocs.io/en/stable/index.html)
ヒトが手動で整えていたコードスタイルのコントロール権を、フォーマッタに譲渡することになります。その見返りとして、コードスタイルに関する悩みから解き放たれて、コードスタイル以外の重要な課題解決のために時間と精神的エネルギーを節約できます。
コードスタイルに関するレビューをなくすことができます。 より、コードの内容に意識を集中させることができ、レビュープロセスを効率化することができます。
どうやって使うのか
インストール
pip install black
実行
カレントディレクトリ配下の .py ファイルを全てフォーマットする場合。
black .
jupyter notebook (ipynb ファイル) を整形することもできます
pip install black[jupyter]black foo.ipynb
結論
Black を使って、コードを読みやすくして、開発とレビュープロセスを効率化しましょう。
おまけ
git hooks の設定
Git で管理しているプロジェクトディレクトリの .git/hooks/pre-commit
ファイルに、下記のように設定しておくことで、commit 前に Black が自動実行されるようになります。
#!/usr/bin/env bashblack .
実行可能ファイルにしておかなければいけないことに注意が必要です。 実行可能ファイルにするために、下記のコマンドを実行します。
chmod +x .git/hooks/pre-commit
より高度に git hooks を管理したい場合は、Python 製の pre-commit や JavsScript 製の husky のようなツールを使うと良さそうです。
その他の Python フォーマッタ
Black 以外に、autopep8 や Google が出している yapf が有名なものとして挙げられます。
この記事では詳細な比較は扱いませんが、あとはプロジェクトごとの決めの問題かと思います。