Python プロジェクトにフォーマッタ・Linter を導入する : yapf + flake8
Python プロジェクトに、フォーマッタと Linter を導入してみる。
目次
どんなツールがあるか
まずはどんなフォーマッタや Linter があるか調べてみる。JavaScript 界隈だと ESLint が一強だが、Python 界隈はもう少し色んなツールがあるみたい。
フォーマットは老舗の autopep8、柔軟な設定ができる yapf、逆に設定に柔軟性を持たせない設計思想の black、といったモノがあるようだ。
Linter は公式のスタイルガイドに準拠する pep8、スタイルには関与しない設計思想の pyflakes、pep8 をより厳しくしたプラグイン式の flake8、その flake8 をベースにより厳格なルールを追加する hacking、そして pylint などがあるようだ。
- 参考 : Visual Studio CodeでPythonの開発環境構築を構築してみた。 | Developers.IO
- 参考 : Python環境構築ベストプラクティス2019 - ばいおいんふぉっぽいの!
使用感などを見た感じ、yapf でフォーマットし、flake8 で Lint チェックを行うのが良さそうだったので、この環境を作っていくことにする。
- GitHub - google/yapf: A formatter for Python files
- GitHub - PyCQA/flake8: The official GitHub mirror of https://gitlab.com/pycqa/flake8
pipenv でモジュールをインストールする
pipenv を使って、yapf と flake8 をインストールする。--dev
オプションを付けて pipenv install
すると、Pipfile の [dev-packages]
に記載されるようになる。
$ pipenv install --dev yapf flake8
使ってみる
とりあえず使ってみるなら、以下のように叩けば良い。
$ pipenv shell
# src/ ディレクトリ内のコードを自動フォーマットして上書きする
$ yapf -r -i ./src/
# src/ ディレクトリ内のコードを Lint チェックする
$ flake8 --show-source ./src/
Pipfile の [scripts]
に書いておくと実行が楽になるだろう。
[scripts]
format = "yapf -r -i ./src/"
lint = "flake8 --show-source ./src/"
コレで pipenv run format
や pipenv run lint
で実行できるようになった。
設定ファイルで調整する
僕は Python でも2スペースインデントで実装したいので、少し設定をいじることにした。
yapf の設定は .style.yapf
というファイルを用意すれば設定できる。flake8 は .flake8
というファイルを書く。いずれも ini ファイル形式で記述するので、以下のサンプルコードを参考に。
.style.yapf
以下のように [style]
ブロックを作って設定する。
[style]
based_on_style = pep8
column_limit = 240
indent_blank_lines = True
indent_width = 2
continuation_align_style = 'VALIGN-RIGHT'
no_spaces_around_selected_binary_operators = False
space_between_ending_comma_and_closing_bracket = True
spaces_around_default_or_named_assign = True
spaces_around_power_operator = True
spaces_before_comment = 2
.flake8
flake8 は [flake8]
ブロックで記述する。yapf で2スペースインデントに整形するよう設定しているので、それに合わせてバッティングするチェック項目を無視するようにしている。
[flake8]
ignore = E111, E114, E251, E265, W293
max-line-length = 240
yapf の整形ルールを無視したい時は
僕は「垂直アラインメント」を書きがちなのだが、yapf はコレを自動整形してしまう。自動整形の対象外にしたい箇所では、コメントを書いてやれば回避できる。
def example():
# yapf: disable
one = 'Hoge'
second = 'Fuga'
some = 'Foo'
# yapf: enable
以上
Python 環境におけるフォーマッタと Linter は、yapf と flake8 で十分そうだ。