採用はこちら!

Shinonome Tech Blog

株式会社Shinonomeの技術ブログ
2 min read

Python のフォーマッタの比較と VSCode での設定方法

自動でコーディングスタイルを統一させてくれる便利なフォーマッタ。Python で使えるものの比較と VSCode での使い方を紹介します。

こんにちは。バックエンドコースの gakuto です。Advent Calendar 1 日目ということで、Python で使えるフォーマッタをいくつか紹介し、VSCode での設定方法をまとめていきます。

フォーマッタとは?

人によってコードの書き方が違ったり、一人で書いているときも完璧にコーディングスタイルを統一することは難しかったりしますよね?
フォーマッタを使うことで、自動でコーディングスタイルを統一することができます。また、エディタで適切に設定すれば、ファイル保存時に自動でフォーマッタを呼び出すこともできます。

Python で使えるフォーマッタ3選

以下のコードを3つのフォーマッタで整形させます。行の長さをどう短くさせるかが見ものです。すべて行の長さを 79 文字までに設定し、その他はデフォルトのままにしています。

元のコード

autopep8

昔からあるやつで、今でも VSCode のデフォルトのフォーマッタです。特徴は --aggressive オプションの数によって強さが変わることです。

autopep8 (--aggressive なし)

--aggressive なしだと行の長さが 79 文字以下になっていないですね。

autopep8 (--aggressive 1つ)

--aggressive をつけるとこんな感じになりました。今回は2つつけても変わりませんでした。

black

最近の流行りのフォーマッタです。バックエンドコースの最終課題でも black が指定されています。特徴としては設定できる項目が少なくシンプルで、「とりあえず black に従っとけ」というのができるところです。

black 

文法上無意味な () を加えられましたがさすが美しいですね。私は昔からシングルクォート派だったんですがそれもダブルクォートにされました。これは無効化することはできてもシングルクォートに統一する設定はできないようです。

yapf

Google が開発したオープンソースのフォーマッタです。これだけ聞くとめっちゃ強そうですが black には勝てるのでしょうか。

yapf

まあ無難にきれいですね。 autopep8 と比べるとインデントで少し見やすくなっている気がします。

VSCode での設定方法

グローバルでも設定できますがプロジェクトごとにコーディングスタイルは違うと思うので今回はワークスペースに対して適用したいと思います。また、バックエンドコースの最終課題でも指定されている black を使いたいと思います。

ワークスペースの一番上の階層に .vscode というディレクトリを作りその中に settings.json というファイルを作って以下の内容を記述してください。

{
  "editor.formatOnSave": true,
  "python.formatting.provider": "black",
  "python.formatting.blackArgs": [
    "--line-length",
    "79",
  ],
}
.vscode/settings.json

editor.formatOnSave はファイル保存時に自動でフォーマットする設定です。 python.formatting.provider は何でフォーマットするかの設定です。 python.formatting.blackArgs は black を実行する時に渡すコマンドライン引数です。

あとは black をインストールするだけです。上の設定ファイルを置いた状態で Python のファイルを保存しようとすると右下に black をインストールするか聞かれるのでそれではいを押せばインストールできますが、他の開発者と使用ツールを共有するために requirements.txt に書くことをおすすめします。

一応これは最小限の設定なので現在バックエンドコースを受講している方は課題で指定されている設定ファイルを使ってください。

最後に

いかがでしたでしょうか。フォーマッタによってこんなに見た目が変わるのは意外ですよね。自分のプロジェクトでは自分の好みのフォーマッタを使い、チーム開発や他人のプロジェクトではそのプロジェクトで指定されたフォーマッタを使えるようにしましょう。

明日は Yuta くんの記事です!バックエンドコースの同期なので楽しみです。

参考文献