📑

Pythonのフォーマッター選定とVSCodeとのインテグレーション

2022/07/23に公開

前提

  • venv を利用する
  • すでにアクティベートされた状態で作業しているものとする

各種フォーマッターについて

JavaScript では Prettier がデファクトになっているが、Python だとどうだろうと思って調べてみると、以下がよく利用されているらしい

  • isort
  • autoflake
  • black

この記事では全部使うので pip install isort autoflake black でまとめてインストールしてしまう。

isort

主にやってくれること

  • import文のソート
  • import文をPEP8に準拠した書き方に修正

ソートに関しては自明でアルファベット順にimport文宣言するなど。

PEP8はPythonの標準ライブラリなどが採用しているコーディング規約で、異なるモジュールのimport文を1行にまとめないとかimport文に関してはそういった規定があるのでその辺に合わせて直してくれる。

ここでは既定の設定をそのまま用いるので深掘りしないが isort -h 実行でわかるが多機能でかなり細かく設定できる。

autoflake

主にやってくれること

  • 未使用のimport文や変数の除去

pyflakes っていう静的解析ツールがあって、それによって報告されたものに対して処理を行うというカラクリになっているらしい。

black

主にやってくれること

  • クオテーションの仕方の統一
  • カンマや括弧の調整
  • 改行タイミングの調整

などなど

VSCodeとのインテグレーション

そもそもフォーマッターについて調べようと思った契機が、Pythonを採用しているプロジェクトでフォーマッターは導入されているものの、IDEとの統合がうまくできていなかったため。
ファイルを開いたときにインデントが規約に則った設定値にならないから手動で設定しなおしたり、フォーマッティングもコマンドで手動で行ってたりしててめんどくさかったのでそれをなんとかしようというのがこの記事のモチベーションになってる

なのでこのセクションではVSCodeとのインテグレーションを行なっていく。

なお、ここでは設定に関してはGUIではなくjson形式の設定ファイルの編集で行なっていく
同様のことはコンテキストメニューからでも設定できるはず

isort

デフォルトでVS Codeの標準のimport並び替え用のパッケージとして組み込まれているらしいので、保存時にisortが実行されるように設定すればいい

https://code.visualstudio.com/docs/python/editing#_sort-imports

以下を追加すればそんなふうになる

.vscode/settings.json
{
  "editor.codeActionsOnSave": {
    "source.organizeImports": true
  }
}

autoflake

これは後回しで。
調べ方が悪かったのかもしれないが設定ファイル編集するだけでなんとかする方法がすんなり出てこなかった

Run on Save っていうプラグイン噛ませたりする方法はあったけど他のリンターだったりIDEが備えている標準的な機能だったりで未使用の変数のハイライトなどは実現難しくないので、パッケージ1つ増やして色々設定するコスト鑑みたらこれは別にいらないかも・・・

black

python.formatting.provider みたいなディレクティブを有効にするにはこのプラグインが必要なので予め入れておく
https://marketplace.visualstudio.com/items?itemName=ms-python.python

以下で保存時にblackによるコード整形が実行されるようになるはず

.vscode/settings.json
  "python.formatting.provider": "black",
  "python.formatting.blackPath": "${workspaceFolder}/venv/bin/black",
  "editor.formatOnSave": true,

設定ファイルは最終的には以下のようになった

.vscode/settings.json
{
  "[python]": {
    "editor.codeActionsOnSave": {
      "source.organizeImports": true
    },
  },
  "python.formatting.provider": "black",
  "python.formatting.blackPath": "${workspaceFolder}/venv/bin/black",
  "editor.formatOnSave": true,
}

特にプラグイン追加することなく 設定ファイルを宣言的に書いて保存時に自動的に整形が走るようになった。やったね✌️

Discussion