1. 記事一覧 >
  2. ブログ記事
VSCode
category logo

VS CodeでPythonのコードフォーマッター(black)、リンター(flake8)をセットアップ

(更新) (公開)

Deprecated

【2023年9月追記】

設定を進めると、settings.json に 『この設定は間もなく非推奨になります。Autopep8 拡張機能または Black Formatter 拡張機能を使用してください。詳細については、「https://aka.ms/AAlgvkb」を参照してください。』 と警告が表示されます。

この記事公開以降、VS Code の拡張機能で black、flake8 両方実現できるようになりました。(pip install不要です。)

新記事「Pythonのコードフォーマッター(black)、リンター(flake8)をVSCode拡張機能で導入」を追加しています。

【2023年11月追記】

Python拡張機能(microsoft/vscode-python)のアップデート(v2023.20.0)により、この記事記載の以下の設定がとうとうなくなりました。

python.formatting.provider

python.linting.pylintEnabled

python.linting.flake8Enabled

python.linting.lintOnSave

python.linting.flake8Args

この記事の内容が通用しなくなったため、

新記事「Pythonのコードフォーマッター(black)、リンター(flake8)をVSCode拡張機能で導入」を参照してください。


VSCode 1.84 & Python拡張機能 各バージョンの状況を調査しましたところ、以下の状況です。
※ブログ投稿時は、v2021.8.1105858891 です。


1.python.formatting.providerpython.linting.* 設定について

Python拡張機能python.formatting.providerpython.linting.*
v2023.20.0設定できない設定できない
v2023.18.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.16.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.14.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.12.0設定できる設定できる
v2021.10.1317843341設定できる設定できる
v2021.9.1246542782設定できる設定できる
v2021.8.1105858891設定できる設定できる

2.python.linting.pylintEnabled 設定について

Python拡張機能python.linting.pylintEnabled
v2023.20.0設定できない
v2023.18.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.16.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.14.0検索に出てこないが、settings.jsonに直接書いて有効(警告表示あり)
v2023.12.0設定できる(デフォルト=OFF)
v2021.10.1317843341設定できる(デフォルト=OFF)
v2021.9.1246542782設定できる(デフォルト=ON)
v2021.8.1105858891設定できる(デフォルト=ON)

はじめに

今回、ほぼVS Code(Visual Studio Code)をインストールした直後の状態から、
・コードフォーマッター(Black)導入
・リンター(flake8)導入
・インデント色分け(indent-rainbow)導入
までの手順を書きたいと思います。
なお、Blackは、Python3.6以上が必要です。


”ほぼ”と書いたのは、前回の続きで、SSHリモートデバッグ、Pythonの拡張機能が既にインストールされている前提になります。本当に最初からの場合、前回の記事を実施してからやってみてください。
今回、やっていることの意味を説明しやすいように、”Windows側”、”サーバー側”としていますが、SSHリモートデバッグではなく、VS Code, python が同居している場合でも、同じような手順です。

コードフォーマッター(Black)、リンター(flake8)、インデント色分け(indent-rainbow)導入図

【コードフォーマッター】

コードフォーマッター(Code formatter)とは、以下のように自動的にコードを一定のフォーマットに直してくれる機能です。今回「Black」を採用します。

コードフォーマッター(Code formatter)説明動画

【リンター】

リンター(linter)とは、以下のようにコードのまずいところを指摘してくれる機能です。今回「flake8」を採用します。flake8によって、PEP8に準拠したコードになっているかチェックができます。

リンター(linter)説明

【PEP8】

Pythonのコーディング規約の一つです。規約の内容の説明は、ここでは割愛します。

【indent-rainbow】

indent-rainbowは、以下のようにコードのインデントを色で分けて、視覚的に見やすくしてくれる機能です。

indent-rainbow説明

【SSHリモートデバッグ】

sshで接続できるところにソースコードが有る場合、他PCのVS Codeからそのまま編集、デバッグができる機能です。


【検証環境】

Raspberry Pi Desktop OS(詳細は、下記【サーバー側環境】)

 Python 3.7.3

Windows 10 Pro 20H2(x64)

 Visual Studio Code 1.59.0

  Remote Development v0.21.0

  Python v2021.8.1105858891

【サーバー側環境】
Raspberry Pi OSをVMware-workstation-16.1.1にインストール」でインストールした環境です。

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 10 (buster)
Release:        10
Codename:       buster
# uname -a
Linux raspberry 4.19.0-13-amd64 #1 SMP Debian 4.19.160-2 (2020-11-28) x86_64 GNU/Linux
# cat /etc/debian_version
10.7

Blackインストール

Blackインストール図 ここでは、ソースコードが
192.168.11.9 の /home/pi/wiringpi-python-bme280
にあるものとします。
※192.168.11.9は、Python3が最初からインストールされていて、SSHリモートデバッグできる環境を前提とします。
ユーザー名は、piとします。


Windows側 VS Code は、Visual Studio Code 1.59.0 です。以下の状態からスタートとします。
作業スタートの状態
ユーザー名は、adminとします。


Blackをインストールします。サーバー側の作業になります。

# pip install black
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting black
  Could not find a version that satisfies the requirement black (from versions: )
No matching distribution found for black

となるため、
pip3でインストールが必要でした。
※Python2 と Python3両方インストールされていて、blackは、Python3にしか無いためです。

# pip3 install black
# which black
/usr/local/bin/black

ちなみに、Windowsの場合、以下になりました。

>pip install black
>where black
C:\Users\admin\AppData\Local\Programs\Python\Python39\Scripts\black.exe

Black設定

Windows側VS Codeの作業になります。
左下の歯車をクリックして、「設定」をクリックします。
(ショートカットキーの「Ctrl」を押しながら「,」でも同じです。)
「設定」をクリック


ここで、ユーザー、リモート[SSH: 192.168.11.9]、ワークスペース
とありますが、概ね下記のような違いがあります。
ユーザー、リモート[SSH: 192.168.11.9]、ワークスペース


ユーザー:
今回、adminでログインしてVS Codeを起動しているため、adminでログインして、VS Codeを起動した場合に適用される設定になります。
設定値は、C:\Users\admin\AppData\Roaming\Code\User\settings.jsonに保存されます。


リモート:
今回、pi@192.168.11.9 にSSH接続しているため、pi@192.168.11.9 でSSH接続したときに適用される設定になります。
設定値は、/home/pi/.vscode-server/data/Machine/settings.jsonに保存されます。


ワークスペース:
今回、開き元が/home/pi/wiringpi-python-bme280のため、ワークスペースは、/home/pi/wiringpi-python-bme280がワークスペースになります。
設定値は、/home/pi/wiringpi-python-bme280/.vscode/settings.jsonに保存されます。


フォルダー:
今回、開き元が/home/pi/wiringpi-python-bme280でフォルダーを追加していないため、ワークスペース=フォルダーになって、「フォルダー」が表示されていませんが、「ファイル」→「フォルダーをワークスペースに追加」で追加した場合、選択できるようになります。
例えば、/home/pi/wiringpi-python-bme280-2を追加し、そのフォルダー(ディレクトリ)で設定した場合、設定値は、/home/pi/wiringpi-python-bme280-2/.vscode/settings.jsonに保存されます。


優先順位は、低い→高いの順に
ユーザー→リモート→ワークスペース→フォルダー
です。(フォルダーのsettings.jsonが一番優先順位が高いです。)

設定のスコープ優先順位の図


今回は、リモート[SSH: 192.168.11.9]を選択して進めていきます。


フォーマッターをBlackに設定します。
検索欄に「python.formatting.provider」と入力して、設定値を「black」とします。
フォーマッターをBlackに設定


保存時にフォーマットするようにします。
検索欄に「editor.formatOnSave」と入力して、設定値の「Format On Save」にチェックを入れます。
保存時にフォーマットする


このとき、設定は、以下のように/home/pi/.vscode-server/data/Machine/settings.jsonに自動的に保存されます。

# pwd
/home/pi
# cat .vscode-server/data/Machine/settings.json
{
    "python.formatting.provider": "black",
    "editor.formatOnSave": true
}

blackにパスが通っていない場合、(コマンドラインで、black --versionが反応しない場合)

"python.formatting.blackPath": "C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python39\\Scripts\\black.exe",

のように「python.formatting.blackPath」の設定にフルパスで書く必要があります。(この例はWindowsです。最初からフルパスで指定して追加しておいてもOKです。)


Black動作確認

syntaxエラーを起こさないようにコードを汚くして、保存します。
コードを汚くして、保存
このように、自動的にフォーマットされれば、OKです。


なお、syntaxエラーが発生したり、致命的な問題が有る場合、保存しても何も起きません。


その場合、直接起動してみると、以下のように何か分かるかもしれません。

$ black debug.py 
error: cannot format debug.py: Cannot parse: 6:6: print("5)
Oh no! 💥 💔 💥
1 file failed to reformat.

1 file failed to reformat.


flake8インストール

flake8をインストールします。サーバー側の作業になります。

# pip3 install flake8
# which flake8
/usr/local/bin/flake8
# flake8 --version
3.9.2 (mccabe: 0.6.1, pycodestyle: 2.7.0, pyflakes: 2.3.1) CPython 3.7.3 on
Linux

ホワイトスペースだけが有る行を挿入して、flake8に読み込ませると、以下のようになります。

# flake8 debug.py
debug.py:6:1: W293 blank line contains whitespace

flake8設定

flake8設定図 リンターは、デフォルトでPylintが有効になっているため、無効にします。
検索欄に「python.linting.pylintEnabled」と入力して、設定値の「Pylint Enabled」のチェックを外します。
Pylint無効


flake8を有効にします。
検索欄に「python.linting.flake8Enabled」と入力して、設定値の「Flake8 Enabled」にチェックを入れます。
flake8を有効にする


インタープリター=Python3(左下の表示で分かります。)

インタープリター=Python3

かつ、pip install flake8でインストールした場合、Python3用のflake8がインストールされていないため、

Linter flake8 is not installed

と表示されます。

Linter flake8 is not installed

保存するたびにコードチェックされるようにします。
検索欄に「python.linting.lintOnSave」と入力して、設定値の「Lint On Save」にチェックを入れます。
※デフォルトで有効でした。 保存するたびにコードチェック


コードチェックルールを少し変更します。
検索欄に「python.linting.flake8Args」と入力して、設定値の「項目の追加」ボタンをクリックします。
コードチェックルールを少し変更


「--max-line-length=88」を入力して、「OK」ボタンをクリックします。
--max-line-length=88


「項目の追加」ボタンをクリックし、「--ignore=E203,W503,W504」を入力して、「OK」ボタンをクリックします。
--ignore=E203,W503,W504


--max-line-length=88
コードフォーマッターのblackが1行88文字の仕様なのに対し、flake8は、79文字を超えているとエラー判定します。これを回避するため、flake8を88文字を超えるとエラーとしています。


以下のようなコードの時、問題になります。

print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")

E501エラー

⇒Blackが88文字までは折り返さないで1行で表示しようとする→flake8は79文字を超えているためエラー


--ignore=E203,W503,W504
以下のエラーを回避するために設定しています。
E203:a = x[(1 + 1) : 5]のように、:の前後にスペースがある場合にエラー(Whitespace before ':')
E203エラー
W503:演算子の前に改行が有るとエラー(Line break occurred before a binary operator)
W504:演算子の後に改行が有るとエラー(Line break occurred after a binary operator)
W503、W504エラー

以下のようなコードの時、問題になります。

x = (
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    + cccccccccccccccccccccccccccccccccccc
)
a = x[(1 + 1) : 5]

Blackの整形により、E203、W503が不可避の場面が有ります。 E203、W503が不可避の場面


Blackは、改行した後演算子で折り返すようですので、W504は、Blackを使う限り、発生しませんでした。
また、--ignore=自体の設定が無い場合、W503、W504は発生しませんでした。元々デフォルトで、W503、W504は無視されているということになりますので、やはり、E203とセットで設定した方が良いと思われます。


ここまでで、以下の設定になります。

# pwd
/home/pi
# cat .vscode-server/data/Machine/settings.json
{
    "python.formatting.provider": "black",
    "editor.formatOnSave": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--max-line-length=88",
        "--ignore=E203,W503,W504"
    ]
}

このsettings.jsonについて、ここまで設定画面で設定していましたが、手で書いて置いても同じことです。


flake8動作確認

--ignore=の説明とやや重複しますが、以下のコードをコピペして保存直後、Blackによって整形されて、エラーにならなければ、OKです。

x = (
    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + cccccccccccccccccccccccccccccccccccc
)
a = x[(1 + 1):5]

※コピペした直後はエラーになります。


後は、エラーの確認ですが、以下のような”インデントするべきところがインデントされていない”コードで、
Expected an indented block (E112)
が出れば、OKかと思います。(他のエラーも出ますが。)

def print_list(my_list):
"""This should be indented"""
    print('Nope')

Expected an indented block (E112)
⇒このコード、致命的に間違っているため、"""This should be indented"""をインデントしないと、Blackが整形しません。(Blackがどうしたいコードなのか判断できない。)


indent-rainbowインストール

indent-rainbowインストール図 コードフォーマッター、リンターではないですが、Pythonコードが見やすくなる拡張機能になります。(見やすいかどうかは人によると思いますが。)
indent-rainbowをインストールすると、下の画像のようにインデントが虹色に色分けされて表示されます。
インデントが虹色に色分けされて表示


拡張機能のアイコンをクリックして、検索欄に「indent-rainbow」を入力します。
「indent-rainbow」をクリックして、「SSH: 192.168.11.9 にインストールする」を入力します。
「indent-rainbow」をクリック


indent-rainbow動作確認

インストール出来たら、単純にソースコードをクリックするだけになります。
このようになります。 ソースコードをクリック


設定で色が変更できたりしますが、ここまでとします。
設定で色が変更できたりする


できました!

loading...