Python のフォーマッター black 導入の解説とその際に出たエラー【Windows】【VSCode】

black とは何か?についてや、インストールの際エラーがいくつか出てなかなか自動フォーマットが当たらなかったので、その時の症例と解決について紹介します。

2020-05-02

目次

導入時環境

  • Windows 10 バージョン 1909 ビルド 18363.778
  • Python 3.7.7
  • VSCode 1.44.2
  • black 19.10b0

Black とは

Python のコードフォーマッターです。フォーマット、すなわち、コードを自動で整形してくれます。
コードの書き方は人それぞれですが、それをある一定のルールに従わせ、見栄えも良くし全てのエンジニアにとって分かりやすいコードにするために導入します。

ある一定のルールというのはリントツールというものにより定められていて、フォーマッター導入時には同時にこのリントツールも入れてやることで、どんなルールで整形するか、を定めます。

有名なものだと pycodestyle, flake8, pyLint などがリントツールにあたり、フォーマッターには今回紹介する black の他に autopep8 や yapf などがあります。

どんな人が入れるべき?

Web アプリ開発やパッケージ開発をしている人は必ず導入するべきだと思います。(個人開発 or 複数人開発問わず)

アプリ開発だと、個人で開発しており、コードを外部に見せるつもりはないから、入れる必要は無いと考える方もいらっしゃると思います。
しかし、コードの一部を質問サイトに上げたり、いずれ複数人で開発するといった可能性がゼロでは無いと思うので、その時に他人が見やすいコードにしておくべきでしょう。

Python を AtCoder 等のプログラミングコンテストやアルゴリズムの勉強、研究のみの目的のため利用している方は必ずしも入れる必要はありませんね。

なぜ black を?

2020 年 5 月時点ですが、主要の 3 つのフォーマッターの中で、最も新しく、Github のスター数もトップで世界的に最も注目されているからです。

メンテナンスの頻度などの問題から、コーディングの技術は基本的に新しいものを使う方が良いでしょう。

また、リンターには flake8 を選びました。
リンターのルールは pycodestyle, flake8, pyLint の順に厳しくなるため、中間のものを選ぶことにしました。

インストール

pip install flake8 blackと実行しましょう。

また、エディター(VSCode)側で自動フォーマットを有効にします。

"python.formatting.provider": "black", // フォーマッターをblackに設定
 "python.linting.pylintEnabled": false, // pyLintをオフに
 "python.linting.flake8Enabled": true, // flake8をオンに
 "python.linting.enabled": true, // リンターを有効に
 "python.linting.lintOnSave": true, // 保存時にリンターが効くように
 "editor.formatOnSave": true, // 保存時にフォーマットをオンに
 "editor.formatOnType": true, // タイピング時にフォーマットをオンに
 "editor.formatOnPaste": false // 貼り付け時のフォーマットはオフに

以上のように VSCode の settings.json に入力しましょう。

settings.json は VSCode 左隅下にある設定アイコンから設定画面を開き 、以下画面の右上のアイコンをクリックすると開けます。

これで導入は完了しました。

思い思いに python 文を書いてみましょう。
保存時に自動でコードがフォーマットしてくれると思います。

しかし、正常に動作していない・インストールできない場合は以下もご覧ください。

エラー ①

私の場合はまずインストール時に以下のエラーが出ました。

ERROR: astroid 2.3.1 has requirement six==1.12, but you'll have six 1.14.0 which is incompatible.

これは astroid(バージョン:2.3.1)というパッケージが six というパッケージのバージョンを 1.12 を要求しているが、今 1.14 にバージョンが上がっているから 1.12 に戻せ、というメッセージです。

そこで、

pip uninstall six
 pip install six==1.12.0

をコマンドで実行しました。

エラー ②

まだ動かなかったので、where.exe black(mac なら次のコマンドにあたる: which black)で black の path が通っているか確認しました。

path とは何か? path が通るとはどういうことか?については別記事にて解説します。

すると、次のエラーです。

ImportError: cannot import name '_ast3' from 'typed_ast'

と出ました。black と typed_ast というパッケージとで依存関係に問題があるようでした。
そこで、

pip install —force-reinstall —upgrade typed-ast black

を実行し、強制的に typed-ast と black を再インストールしました。

エラー ③

これで動くようになったはずです。
もう一度where.exe blackを打つと、しっかり path が通っていることが確認できました。

ですが、まだ保存時のフォーマットが効かなかったです。

そこで、コマンドラインから直接フォーマットを当てるコマンドを試しに入力してみることにしました。

なんらかの python ファイルがあるディレクトリ(本記事ではtest.pyというファイルを置きました)にて、

black test.py

と実行してみると、うまく整形してくれました!

同時に、そのファイルの python 文に変更を加え保存してみると、自動整形もなぜか当たるようになりました!

めでたし、めでたしです。

おわりに

以上で black の導入の解説とその際に出たエラーの紹介を終わります。

コードは読みづらいと本当にストレスが溜まるので、是非リンター・フォーマッターを導入し、快適なコーディングライフを送りましょう!

All your life with nothing but Happiness
2021 — Misprochef