Pythonのlinterである flake8 はプラグインを追加することでチェックの項目を増やすことが出来ます。
その拡張性の高さもあって数多くあるPythonのlinterの中でもよく使われているツールですが、 逆にプラグインがたくさんありすぎて何を入れたらよくわからない、といった点もあります。
wemake-python-styleguide もflake8のプラグインの一つですが、他のプラグインもまとめて導入してくれる プラグインになっています。
flake8のプラグイン
flake8 はPythonのlinterですが、 以下の3つのlinterのwrapperツールになっています。
また、これら以外のツールもプラグインとして追加して、
flake8
コマンド1つですべてをチェックすることが出来るような仕組みもあります。
この前Pythonの開発環境でのpre-commitについて書いた際、 flake8も含まれていました。
ここで、flake8のプラグインとして、
- flake8-pyproject
- flake8-annotations-complexity
- flake8-bugbear
- flake8-builtins
- flake8-comprehensions
- flake8-debugger
- flake8-docstrings
- flake8-executable
- flake8-pep3101
- flake8-print
- flake8-rst-docstrings
- flake8-string-format
- pep8-naming
を追加していました。
正直これらを全部調べて必要なものを加えるような作業はけっこう大変です。
最初は人の設定などを参考に上のうちの数個を使っていた程度でしたが、 最近はwemake-python-styleguideというプラグインを参考にできるだけ 追加するようにしています。
wemake-python-styleguide
wemake-python-styleguide もflake8のプラグインですが、独自のチェックツールを持つとともに、 依存パッケージとして多くのプラグインパッケージを追加してくれるようになっています。
Violations を見ると 追加で入れているプラグイン、及びそのエラーコード一覧があります。
また、 Migration guide to 0.14 を見ると flake8-executable や flake8-print などは簡単な実装なためwemake-python-styleguideの中に取り入れられてるとあります。
このwemake-python-styleguideを入れればflake8のプラグインは一通り入れられるような感じになっているのでこれを直接使いたいところなんですが、 現状ではちょっと依存関係のせいで自分の環境だと使えない状態になっています。
問題はwemake-python-styleguideがflake8 >=3.7,<5
に依存していることです
1。
現在flake8の最新バージョンは6.0.0ですが、5.Xでも使えません。
これはpyproject.tomlから設定を読むためにFlake8-pyprojectとかを使いたい場合
conflictしてしまいます(flake8>=5
)。
これを回避するにはFlake8-pyprojectの古いバージョンでflake8の古いバージョンに対応する物を使うか、
wemake-python-styleguideのHEAD versionを使うと^5.0
への対応に変わっているため
2
flake8に関しては使えるようになります。
これらを合わせても、flake8 5.Xを使うとpycodestyleのバージョンが>=2.9.0,<2.10.0
となって、
autopep8とかが要求する>=2.10.0,<2.11.0
とconflictします。
この辺も全て古いものに合わせれば使えないこともないのですが、流石にやりすぎな感もあって、 wemake-python-styleguideを使うと簡単に全部入れられる、という点と矛盾してくるので難しいところです。
なので wemake-python-styleguide独自のものは一部取り入れられないことになりますが 現状では各プラグインを直接入れています。
各プラグインの対応
比べてもらうと上に書いたプラグインとかはほとんど網羅されてることがわかると思います。 入ってないのは
- flake8-bandit: banditのオプションをpyproject.tomlから読みたいのでbanditを直接使う
- flake8-isort: isortでformatも行いたいのでisortを直接使う
- flake8-commas: formatterとして使っているblackとの互換性がないため
- その他無理に入れなくても良いかと思ってるもの
wemake-python-styleguideを入れるとこれらすべてのチェックが有効になるので 逆に入れたくないものも入ってしまうこともあるかと思います。
その際にはflake8のignoreオプションを使って外していく必要があります。
その点では直接プラグインを入れると選べるのでメリットもあります。
その他のプラグイン
また、取り入れていないプラグインの中で、特定の用途だったりフレームワーク用のものだったりするものに関して Plugins and hooks にリストがあります。
ここに必要なものがあれば追加でいれるのも良いかと。
formatter
wemake-python-styleguideはflake8のプラグインなので flake8でチェックして警告を出すだけです。
そこで共に使うと良いformatterが Auto-formatters で紹介されています。
- autopep8
- wemake-python-styleguideで指摘した部分が直されていればautpoep8が直す部分はなくなるように網羅されている。ただしautopep8でformatしてもwemakey-python-styleguideでの指摘は残ることもあるので手動で直す必要があることもある。
- これ以外にautoflake、docformatter、unify、及びautopep8も含めたこれらのツールを同時に実行するためのラッパーツールのpyformatも紹介されています。
- isort
- import順を直すツール。
- add-trailing-comma
- flake8-commasで指摘される、配列などで最後の値の後にもcommaを入れるためのツール。
pyformat(autopep8を含む)、isort、add-trailing-commaを使うことで Pythonのformatterとして有名な black 以上の機能を手に入れられる、とあります。
これら以外にGoogle製の yapfも紹介されていますが、 wemake-python-styleguideに互換性を持つような設定が見つかってない、とのこと。 うまい方法があれば教えてくれ、ともあります。
最後に black も紹介されていますが、まず互換性がない、とあります。
blackについて
wemake-python-styleguideは基本的にPEP 8及びflake8に従うような思想で、 blackがそうなってない部分がある、と。
ただ、blackはPEP 8準拠をうたっていて、そこからより制限を強めたようなイメージのものにはなっています。
一部議論はあるようですが、基本的にはPEP 8準拠です。
この辺も準拠しているかどうか、というのは議論の余地があるところ。(ただ、この議論ではどちらかというとそう決めたから今更変えるほうが余波が大きいので変えたくない、という感じではあります。)
PEP 8準拠かどうか、というのを別にしても blackによるformatでwemake-python-styleguideと互換性がない部分で特に気になる点として下のものがあげられています。
- Quote: blackは文字列などは基本ダブルクォート。だけどPython使いはシングルクォート使いのが多い
- Trailing comma: blackは配列などの最後の値のあとのcommaを消す。これは配列に追加の値が入った際など、
git diff
で見るとcommaの分余計なdiffが出て分かりづらくなる - Line length: blackはコメントや文字列などに関して行の長さを見逃すようになっている
また、blackは設定項目が少ないためこれらを変更することが出来ないのでこれらを変更することが出来ない、と。 まあblackは設定項目を少なくすることで初心者でも迷いなく使えるようにしている、という点もあるので 設定を色々いじれないのはblackの原理的な部分でもあったりはしますが。
上の中で最初のクォートに関しては、個人的にもシングルクォートの方が好きです。 USキーボードだとダブルクォートはshiftを押さないと打てないので。
なんですが、blackを使ってたのでダブルクォートの方がスタンダードだと思ってました。 ただ、書くときは面倒なのでシングルクォートで書いておいてblackになおしてもらう、ということをしてたりします。
Trailing commaは確かにあった方が分かりやすいかな、とも。
一行で短い配列書く際にはわざわざ書くのは冗長な気もしますが。
ただ、未だにたまに(1)
でtupleのつもりで書いてエラー出すことがあるので
これは,
つけるようにすれば回避できるな、と
3。
最後に関してはblackの仕様の方が好みです。 コード部分に関してはなるべく短く書きたいですが、文字列とかは下手に途中で切るより1行で書いてしまいたいな、と。 個人的にもともとのline lengthの制限を短め(79)にしている、という点もあるかもしれませんが。
blackはPEP 8に反している部分がある、とのことですが、実はflake8も完全には準拠できていません。
主な点として、配列などのsliceにおける:
の前に空白を入れる、という点が
flake8だと他のif
文の最後の:
とかと同様、空白はなしにせよ、という警告を出すようになっています。
これはflake8というかpycodestyleの問題:
- Flake8 does not follow PEP 8 in slices · Issue #1356 · PyCQA/flake8
- E203: False positive “whitespace before ‘:’ “ on list slice. · Issue #373 · PyCQA/pycodestyle
一方でblackはこの部分をきちんと対応して空白を入れるようになっています。
これがあるのでflake8ではE203
はignoreする設定を入れてる人も多かと思います。
これはautopep8でも整形してしまうのでautopep8を同時に使う場合はそちらでもignoreの設定を入れる必要があります。
(特にblackと同時に使う場合は必須。)
この辺、一長一短な感じで今はblack含めて混同して使っていますが、 この部分読んでからはquoteとtrailing commaのためにblackなしで なんとかする方向に行きたいな、と思ってたりします。
あと、話がそれますが気になってるのはRuff。 Rust製で高速なのが売り。 blackとかでも高速性はよほど大きなプロジェクトでないと気になる程ではないとは思いますが、 気になるようになってきたらこれを使わざるをえないのでは、と。
高速性以外でも後発の利を生かして上のような細かい部分も良い感じにまとめていってくれるんじゃないかな、と期待。 じ実際pandasとか大きなプロジェクトもすでに使ってるということで、今後主流になっていくかもしれません。
その他のツールについて
他のlinterについてもいくつか言及されていて、それらはぜひ使うべきだとも書かれています。
特に有名所は型チェックをするmypyですが、 他にもまだ使ってないですが有用そうなものが載っているので確認してみてください。
その他ドキュメント
そんな感じで思想的な事もあったりしますが、 wemake-python-styleguideのドキュメントには一般的にも有用なことが色々書いてあったりするので 一通り目を通してみると役に立つことも見つかるかもしれません。
- nitpick: andreoliwa/nitpickというツールの設定をオンラインで共有するツールについて
- flakeheaven: flek8用のいろいろな設定を行うためのツール。その中で古いコードでflake8をあてるとエラーがたくさん出すぎて直すの無理、な状態のときに、一旦その状態のエラーは無視して新たに書く部分だけを警告してくれるようにしてくれる方法の説明。
- GitHub Actions: GitHub Actionsでの利用方法
- Jupyter Notebooks: Jupyter Notebooksでflake8を使う方法
- Philosophy: Philosophy
など。
-
https://github.com/wemake-services/wemake-python-styleguide/blob/657508a0b169e15faeda641c4d9c7bc2afda484b/pyproject.toml#L50 ↩
-
https://github.com/wemake-services/wemake-python-styleguide/blob/master/pyproject.toml#L50 ↩
-
(1, 2)
とかならtupleになりますが、1つだと単にその部分を周りから分けるために囲っただけとみなされるので単に1
となります。 長さ1のtupleを作る際には(1, )
のようにcommaが必要。 ↩