- 記事一覧 >
- ブログ記事
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.provider
、python.linting.*
設定について
Python拡張機能 | python.formatting.provider | python.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 が同居している場合でも、同じような手順です。
【コードフォーマッター】
コードフォーマッター(Code formatter)とは、以下のように自動的にコードを一定のフォーマットに直してくれる機能です。今回「Black」を採用します。
【リンター】
リンター(linter)とは、以下のようにコードのまずいところを指摘してくれる機能です。今回「flake8」を採用します。flake8によって、PEP8に準拠したコードになっているかチェックができます。
【PEP8】
Pythonのコーディング規約の一つです。規約の内容の説明は、ここでは割愛します。
【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インストール
ここでは、ソースコードが
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]、ワークスペース
とありますが、概ね下記のような違いがあります。
ユーザー:
今回、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」とします。
保存時にフォーマットするようにします。
検索欄に「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.
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設定
リンターは、デフォルトでPylintが有効になっているため、無効にします。
検索欄に「python.linting.pylintEnabled」と入力して、設定値の「Pylint Enabled」のチェックを外します。
flake8を有効にします。
検索欄に「python.linting.flake8Enabled」と入力して、設定値の「Flake8 Enabled」にチェックを入れます。
インタープリター=Python3(左下の表示で分かります。)
かつ、
pip install flake8
でインストールした場合、Python3用のflake8がインストールされていないため、
Linter flake8 is not installed
と表示されます。
保存するたびにコードチェックされるようにします。
検索欄に「python.linting.lintOnSave」と入力して、設定値の「Lint On Save」にチェックを入れます。
※デフォルトで有効でした。
コードチェックルールを少し変更します。
検索欄に「python.linting.flake8Args」と入力して、設定値の「項目の追加」ボタンをクリックします。
「--max-line-length=88」を入力して、「OK」ボタンをクリックします。
「項目の追加」ボタンをクリックし、「--ignore=E203,W503,W504」を入力して、「OK」ボタンをクリックします。
--max-line-length=88
コードフォーマッターのblackが1行88文字の仕様なのに対し、flake8は、79文字を超えているとエラー判定します。これを回避するため、flake8を88文字を超えるとエラーとしています。
以下のようなコードの時、問題になります。
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
⇒Blackが88文字までは折り返さないで1行で表示しようとする→flake8は79文字を超えているためエラー
--ignore=E203,W503,W504
以下のエラーを回避するために設定しています。
E203:a = x[(1 + 1) : 5]
のように、:の前後にスペースがある場合にエラー(Whitespace before ':')
W503:演算子の前に改行が有るとエラー(Line break occurred before a binary operator)
W504:演算子の後に改行が有るとエラー(Line break occurred after a binary operator)
以下のようなコードの時、問題になります。
x = (
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ cccccccccccccccccccccccccccccccccccc
)
a = x[(1 + 1) : 5]
Blackの整形により、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')
⇒このコード、致命的に間違っているため、"""This should be indented"""
をインデントしないと、Blackが整形しません。(Blackがどうしたいコードなのか判断できない。)
indent-rainbowインストール
コードフォーマッター、リンターではないですが、Pythonコードが見やすくなる拡張機能になります。(見やすいかどうかは人によると思いますが。)indent-rainbow
をインストールすると、下の画像のようにインデントが虹色に色分けされて表示されます。
拡張機能のアイコンをクリックして、検索欄に「indent-rainbow」を入力します。
「indent-rainbow」をクリックして、「SSH: 192.168.11.9 にインストールする」を入力します。
indent-rainbow動作確認
インストール出来たら、単純にソースコードをクリックするだけになります。
このようになります。
できました!
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。