# flakehellを使ってflake8の設定をpyproject.tomlに統合する

# 概要

pythonのlinterとしてよく挙げられるflake8 (opens new window)だが、最近ちょくちょく聞くようになったpyproject.tomlには対応していない(なんか対応しないような雰囲気がある (opens new window))。少し調べるとflakehell (opens new window)というflake8をpyproject.tomlに対応させるラッパーライブラリが存在するらしいので、poetry+vscodeな環境で使ってみる。

# インストール

何も難しいことはない。poetryを使っている環境であれば

$ poetry add -D flakehell

とすればいいだけ。 flake8のcliに相当するコマンドを利用するには例えば

$ poetry run flakehell lint filename

あるいは

$ poetry run flake8helled filename

とする。

# 実行例

以下のようなファイルを用意する。

# asdf.py
import re



def test():
    pass



未使用importがあったりあからさまに余分な改行が多い。

これをflakehellに食わせてみると、

$ poetry run flakehell lint asdf.py
$

何も警告が出ない。ちなみにflake8では

$ poetry run flake8 asdf.py
asdf.py:1:1: F401 're' imported but unused
asdf.py:5:1: E303 too many blank lines (3)
asdf.py:9:1: W391 blank line at end of file
$

という感じになる。これはなぜかというとflakehellはデフォルトではどのプラグインも有効にされていないからである。

flake8のデフォルトに合わせるにはpyproject.tomlに

# pyproject.toml 抜粋
[tool.flakehell.plugins]
pyflakes = ["+*"]
pycodestyle = ["+*"]

のようにプラグインを記述すればいい(はず)。 再度試すと

$ poetry run flakehell lint asdf.py
asdf.py:5:1: E303 too many blank lines (3) [pycodestyle]
asdf.py:9:1: W391 blank line at end of file [pycodestyle]
asdf.py:1:1: F401 're' imported but unused
$

と出てくる。若干順番が違ったりしているが問題なさそう。

この他の.flake8に書くタイプの設定についてもドキュメント (opens new window)を見る限り簡単に移植できそう。

# VSCodeで使う

vscodeのpython拡張は何も指定しなければ確かpylintを使うので、flake8を使っている人は次のような設定になっているんじゃないかと思う。

// .vscode/settings.json 抜粋
{
    // ...
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    // ...
}

このままだとflakehellではなくflake8が実行されることになるので、"python.linting.flake8Path"を使ってそれを書き換える。とりあえずLinux+ディレクトリ内venvで動かすことだけを考えるなら

// .vscode/settings.json 抜粋
{
    // ...
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Path": ".venv/bin/flake8helled",
    // ...
}

みたいにすれば動いてくれると思う。

# まとめ

flakehell自体には特に不満ないし良いプロダクトだと思うんだけどやっぱり理想としてはflake8がちゃんとpyproject.tomlをサポートしてくれることだよなあ。

# 参考文献