Python プロジェクトにフォーマッタ・Linter を導入する : yapf + flake8

Python プロジェクトに、フォーマッタと Linter を導入してみる。

目次

どんなツールがあるか

まずはどんなフォーマッタや Linter があるか調べてみる。JavaScript 界隈だと ESLint が一強だが、Python 界隈はもう少し色んなツールがあるみたい。

フォーマットは老舗の autopep8、柔軟な設定ができる yapf、逆に設定に柔軟性を持たせない設計思想の black、といったモノがあるようだ。

Linter は公式のスタイルガイドに準拠する pep8、スタイルには関与しない設計思想の pyflakes、pep8 をより厳しくしたプラグイン式の flake8、その flake8 をベースにより厳格なルールを追加する hacking、そして pylint などがあるようだ。

使用感などを見た感じ、yapf でフォーマットし、flake8 で Lint チェックを行うのが良さそうだったので、この環境を作っていくことにする。

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 formatpipenv 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 で十分そうだ。