🛠️

VSCodeでPython書いてる人はとりあえずこれやっとけ〜

に公開

はじめに

Pythonはコードが汚くなりがち(個人的にそう思う)
そんなPythonくんを快適に書くための設定を紹介します。

拡張機能編

ここでは Pythonを書きやすくするため の拡張機能を紹介していきます。

1. Error Lens

image.png

before

「コード書いたけど、なんか波線出てるよ💦」
記述に問題があった場合、デフォルトでは波線が表示されるだけ。。。
image.png

after

Error Lensくんを入れることによって 波線だけでなくエディタに直接表示される
はい、有能〜
image.png

2. indent-rainbow

image.png

before

Pythonくんは インデントでスコープを認識している
forf から下に線が伸びてるけど、ちょっと見にくいなぁ
image.png

after

色が付いてちょっと見やすくなった!
image.png

3. Trailing Space

image.png

before

一見、普通に見えるコード
image.png

after

末尾にある無駄なスペースを可視化できる!
不要なものは消しましょうね〜
image.png

4. autoDocstring: VSCode Python Docstring Generator

image.png

三点引用符を使って関数などの説明を書くときにdocstringが自動生成される!!!
有能すぎぃ〜
image.png

image.png

基本設定編

ここでは VSCode自体の設定 を紹介します。
プログラミングをするに当たって必要になってくるものです。

Insert Final Newline

ファイルの保存時、最終行に改行を自動で入れてくれる機能
プログラミングしてるなら必須だよね〜
image.png

https://teratail.com/questions/71778?sort=1

Trim Trailing Whitespace

不要な末尾の空白を自動で削除してくれる機能
↑で紹介した拡張機能「Trailing Space」の削除版
image.png

Pythonの設定編

ここでは Pythonを最低限綺麗に書くため の設定を紹介します。
自分はいつも flake8, black, isort, mypy を使用しています。

black

Pythonのフォーマッタである black
通常は black ファイル名 でコードの整形ができるが、VSCodeに設定すると自動整形することができる。

まずは black のインストールから

pip install black

次に、blackが実行できるか確認する。
テキトーにファイルを作る。
image.png

blackをかけてみる。

$ black black_test.py 
reformatted black_test.py
All done! 🍰
1 file reformatted.

ちゃんと整形されていればOK
image.png

blackのコマンドのパスを確認する。
windowsの場合は、whichじゃなくてwhereかなー。

$ which black
/Users/macuser/Library/Python/3.9/bin/black

VSCodeの設定で black と検索する。
Black Path に ↑で確認できたパスを入力する。
Black ArgsAdd Item を押して --line-length=79 を入力して OK を押す。

line-lengthを設定する理由としては、後述するflake8との競合を回避するため。
Pythonのコーディング規約で一行の文字数は原則79文字と決まっている。
79文字以上に設定する場合はline-lengthの値を変更すると良い。
特に指定がない場合はデフォルトの79文字に設定する方が良い。
image.png

次に python formatting provider を検索する。
デフォルトで autopep8 になっている項目を black に変えればOK
image.png

あとはファイルを整形前に戻して、右クリック。
Format Document (日本語の場合: ドキュメントのフォーマット)をクリックする。
image.png

ちゃんと整形されればOK
image.png

整形処理をファイル保存時に自動で実行するように設定することも可能。
format on save と検索し、チェックボックスにチェックをつける。
image.png

これでファイル保存時に自動でblackが実行されるようになる。完璧。

flake8

Pythonのリンター flake8
これもVSCodeで設定できるので紹介します。

まずはインストールから。

pip install flake8

また同じようにテキトーにファイルを作る。
image.png

実行してみる。

$ flake8 flake8_test.py
flake8_test.py:1:1: E265 block comment should start with '# '
flake8_test.py:5:2: E225 missing whitespace around operator
flake8_test.py:6:2: E225 missing whitespace around operator
flake8_test.py:7:2: E225 missing whitespace around operator

はい、沢山怒られている。

flake8のパスを確認する。

$ which flake8
/usr/local/bin/flake8

flake8 path と検索して↑で出てきたパスを入力する。
image.png

次に flake8 で再検索をかけて、メッセージタイプの設定を行う。
flake8はあくまでリンターであるので、警告レベルにするために W, F, E 全て Warning にすると良い。
image.png

そして、先ほどのファイルを見てみると、、、、
拡張機能編で紹介した Error Lens との相性がバツグンで、どこが汚いコードなのか一目瞭然。有能。
image.png

前述したblackの文字数を調整する場合は flake8 args と検索をかけて Add Item をクリックし、--max-line-length の値を設定してあげる。
デフォルトでは79文字のため、black側で79文字に設定した場合は不要。
image.png

isort

importの順番はPythonのコーディング規約で決まっている。

import文 は常にファイルの先頭、つまり モジュールコメントや docstring の直後、そしてモジュールのグローバル変数や定数定義の前に置くようにします。

import文 は次の順番でグループ化すべきです:

  1. 標準ライブラリ
  2. サードパーティに関連するもの
  3. ローカルな アプリケーション/ライブラリ に特有のもの

上のグループそれぞれの間には、1行空白を置くべきです。

https://pep8-ja.readthedocs.io/ja/latest/#import

でもこれを考えてコードを書くのはめんどくさいので、isortというフォーマッタに任せてしまう。

とりあえず、インストール & パス確認

$ pip install isort
$ which isort
/usr/local/bin/isort

まずはテキトーなコードを書いていく。
flake8に「importしてるのに使ってねえじゃん」って怒られてるけど、サンプルなので まあいい。
image.png

isortの実行

$ isort isort_test.py
Fixing /Users/macuser/Desktop/isort_test.py

ちゃんと整形されればOK
image.png

こいつもVSCodeで設定していくぅ
isort path と入力して↑で確認したパスを入力する。
image.png

とりまこれでOK

次に保存時に自動で実行される設定をする。
code action on save と検索をかけ、一番上に出てきたEditorの設定の Edit in settings.json をクリック。
image.png

設定のjsonファイルが開かれるので、editor.codeActionsOnSave のキーに以下を追加する。

{
  "source.organizeImports": true
}

最終的にこのようになっていればOK

    ...

    "python.sortImports.path": "/usr/local/bin/isort",
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    }
}

これで 保存時にisortが自動で実行される。かんぺきぃ。

mypy

mypyはPythonの型ヒントチェッカー
これはどちらかというと初心者向けではないが、あった方が綺麗(というか分かりやすい)コードが書けるのでよい。
型ヒントを知らない人は調べてください。より良いコードが書けるので。

とりま、インストールして、パスの確認

$ pip install mypy
$ which mypy
/usr/local/bin/mypy

同じように mypyの設定をしていくぅ!
mypy pathで検索をかけて、パスを入力する。
image.png

続いて、mypy enable にチェック〜
image.png

メッセージレベルは information でいいかなって感じ。
mypyにひっかかってもコード自体に問題はないし、規約に反してるわけでもないので。
image.png

ここまで設定できれば、とりあえず型チェックが効く。
aという変数に文字列入れたのに、数字入れるなよってmypyさんに怒られてる図
image.png

あとは mypy args で色々チェック方法をカスタムできるよ〜
自分の設定を晒しておく。
image.png

引数 説明
--warn-return-any 返り値は正確に明示しないとユルサナイ
--no-implicit-optional 型を明示した変数に None を入れるのをユルサナイ
--disallow-untyped-calls 返り値が明示されていない関数を呼び出すのをユルサナイ
--disallow-untyped-defs 関数に返り値の型を明示しないのをユルサナイ
--ignore-missing-imports importしたライブラリ元に型明示がないのは仕方ないよね
--follow-imports=skip importしたライブラリの型チェックは行わないよ

自分がPython書いてきて、↑の設定が自分に合ったものだった。
他にも色々設定できるので、見てみるといいかも〜
https://mypy.readthedocs.io/en/stable/command_line.html

この設定をした場合、このようなコードは怒られる。
image.png

こうすれば怒られない。
image.png

以上が、black, flake8, isort, mypy の設定でした〜
それでは良いPythonライフを〜

付け足し

Pythonについての情報共有ができるLINEのオープンチャットを運営しています。
完全匿名で参加できるので、よろしければぜひ。

オープンチャット「Python」

https://line.me/ti/g2/clUQPZkyNUAnT2n3Yf87KpYv6snMN-PQXGKheg?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

Discussion