- 記事一覧 >
- ブログ記事
Pythonのコードフォーマッター(black)、リンター(flake8)をVSCode拡張機能で導入
はじめに
過去のブログ記事「VS Code で Python のコードフォーマッター(black)、リンター(flake8)をセットアップ」にて、コードフォーマッター black、リンター flake8 をインストールしましたが、このやり方がもはや古い昭和のやり方(言い過ぎ)ということに気付きました。
設定を進めると、settings.json に 『この設定は間もなく非推奨になります。Autopep8 拡張機能または Black Formatter 拡張機能を使用してください。詳細については、「https://aka.ms/AAlgvkb」を参照してください。』
と警告が表示されます。
今や、VS Code の拡張機能で black、flake8 両方実現できるようですので、VS Code の拡張機能で black、flake8 を導入する方法でまた一から検証してみました。
今回のやり方の場合、pip install black
pip install flake8
は不要です。
普通は、
拡張機能をインストール →Format On Save
オン("editor.formatOnSave": true
)→ お好みで細かい設定
で終わりだと思いますが、venv の場合、動かなかったため、その解決方法の紹介も兼ねます。
なお、今回の場合、Windows 10 に Python の venv 環境を作成して、同じ Windows 10 に VS Code がインストールされている前提で進めます。
この記事の最後に紹介しますが、過去のブログ記事のように、Windows -> Linux SSH デバッグ の場合でも同様の手順になります。
"コードフォーマッターとは"、"リンター(Linter、静的コード解析ツール)とは"、"black とは"、"flake8 とは"、に関しての説明は、過去記事の繰り返しになりますので、ある程度省略して進めていきます。
説明が必要な方は、こちらをご覧ください。→「VS CodeでPythonのコードフォーマッター(black)、リンター(flake8)をセットアップ」
Black、Flake8 に関して、推しているわけではないです。Ruff がイケてるという話もありますが、過去のブログ記事の続きという意味で、Black、Flake8 を使います。
VS Code 拡張機能 Black Formatter、Flake8 ともに 2023 年 8 月の時点では、プレビューです。
拡張機能 Black Formatter、Flake8 は、ともに Microsoft 公式の拡張機能です。
Windows 10 PRO 22H2
Visual Studio Code 1.81.1
Python 3.11.5
の環境で確認しました。その他の環境の場合、状況が異なる可能性があります。
SSH Remote 検証時の接続先 Linux は、
Raspberry Pi Desktop OS(Debian GNU/Linux 10 (buster))
Python 3.8.18
です。
※Python 3.8以上が必要です。
概要
前回のブログ記事「VSCode:Win10 Python の venv 仮想環境の場合、ブレークポイントで止まらない件」の続きとします。
前回のブログ記事では、Windows 10 に Python の venv 環境を作成して、ブレークポイントを有効にしました。
それ以外のことは行っていない状況です。
以下のフォルダがワークスペースとします。
非 venv 環境:C:\notvenv
venv 環境:C:\work\venvname
以下の拡張機能があらかじめインストールされているものとします。
VS Code 拡張機能 Black Formatter、Flake8 を利用する場合、pip install black
pip install flake8
は不要です。
なぜ不要かと言うと、以下のようなイメージで、VS Code 独自環境に black, flake8 がインストールされているからです。
※あくまでイメージです。
black, flake8 のバージョンは、
コンソールの
出力 → Black Formatter
出力 → Flake8
で分かります。
拡張機能インストール
導入を開始します。
拡張機能
Black Formatter
Flake8
をインストールします。
各々検索して、Microsoft 公式拡張機能をインストールします。
今回の場合、バージョンは、
Black Formatter v2023.4.1 プレビュー
Flake8 v2023.6.0 プレビュー
でした。
Flake8 設定
ここでは、一旦、特に問題が発生しない非 venv 環境:C:\notvenv
で説明していきます。
後でチェックルールを調整する設定を行いますが、動かすだけの場合、何もする必要はありません。hello.py
を開くと、既に指摘がありました。no newline at end of file Flake8(W292)
(最終行に空白行があるべきという指摘)
Black 設定
保存されたときに、フォーマッタが発動するように、 設定 → Editor: Format On Save にチェックを入れます。
右上の
のアイコンをクリックすると、settings.json が表示されて、
{
"editor.formatOnSave": true
}
が設定されていることが分かります。
これは、手動で書いても同じことです。
なお、この設定は、ユーザー毎の設定にしました。
●● 毎の概念については、過去のブログ記事「VS Code で Python のコードフォーマッター(black)、リンター(flake8)をセットアップ」にて、説明がありますので、そちらを参照してください。
【2023年11月追記】
Python拡張機能 v 2023.20.0 から settings.json の
editor.defaultFormatter
python.formatting.provider
設定が不要になったようです。
「Black フォーマッタ拡張機能がインストールされていますが、それを既定のフォーマッタとして使用しますか?」のメッセージも現れません。
editor.defaultFormatter
python.formatting.provider
を設定しなくても Black が有効になります。
(Black フォーマッタ拡張機能を入れる行為=
"editor.defaultFormatter": "ms-python.black-formatter"
設定と等価と解釈)Python拡張機能 v 2023.20.0 未満の場合は、必要です。
hello.py
(任意の Python プログラム)を保存すると、
「Black フォーマッタ拡張機能がインストールされていますが、それを既定のフォーマッタとして使用しますか?」
のメッセージが現れますので、はい をクリックします。
クリック直後は、一旦無視されますが、もう一度保存すると、black が発動して、フォーマットされます。
上記メッセージの はい をクリックした結果、.vscode\settings.json
に以下の設定が自動追加されます。
これは、上記メッセージを無視して、手動で書いても同じことです。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
},
"python.formatting.provider": "none"
}
意味は、カレントワークスペース(フォルダ)にて、 python プログラムを開いた場合、フォーマッターとして、拡張機能の Black が有効になるという意味です。
先ほど、ユーザー毎の設定の方に、"editor.formatOnSave": true
を設定しましたが、この設定もユーザー毎の設定にしても構いません。ユーザー毎の設定にした場合、打ち消さない限り、python プログラムは常に自動フォーマットされます。
ところで、この設定の内、"python.formatting.provider": "none"
で警告が表示されます。
設定を消しても特に問題なさそうでしたので、消すことにします。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
}
}
Flake8 設定追加
コードチェックルールをデフォルトから少し変更します。
・1 行 88 文字を超えるとエラー
・E203:a = x[(1 + 1) : 5]
のように、:の前後にスペースがある場合にエラー(Whitespace before ':')を無視する
・W503:演算子の前に改行が有るとエラー(Line break occurred before a binary operator)を無視する
・W504:演算子の後に改行が有るとエラー(Line break occurred after a binary operator)を無視する
とします。
なぜそうするかは、black の動作仕様との兼ね合いによるものなのですが、ここでは、とにかくそうするものとして進めます。
詳しい説明は、過去記事「VS Code で Python のコードフォーマッター(black)、リンター(flake8)をセットアップ」をご覧ください。
settings.json の "flake8.args"
で指定します。
今回は、ユーザー毎ではなく、ワークスペース固有の設定とします。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
},
"flake8.args": [
"--max-line-length=88",
"--ignore=E203,W503,W504"
]
}
となります。
"[python]"
の中(対象が Python プログラムのときに有効)には設定できないようでしたので、外に設定しています。
このようなコードを保存して、フォーマットされて、flake8 のエラーにならなければ、成功です。
↓
x = ()
a = x[(1 + 1) : 5]
print("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb")
ヨシ!
venv の場合
続いて、
venv のワークスペースC:\work\venvname
にて、以下の設定を行いました。"editor.formatOnSave": true
は、ユーザー毎の設定のため、設定済みで、理論的には、これだけで動作するはずです。
{
"terminal.integrated.env.windows": {
"PSExecutionPolicyPreference": "RemoteSigned"
},
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
},
"flake8.args": [
"--max-line-length=88",
"--ignore=E203,W503,W504"
]
}
しかし、Black、Flake8 ともに動作しません!
コンソールの
出力 → Black Formatter
出力 → Flake8
を見ると、
[info] [Warn - hh:mm:ss] Skipping standard library file: c:\work\venvname\check.py
となっていて、スキップされたようです。
画像は、Black Formatter ですが、Flake8 も
Skipping standard library file:
です。
結論としては、"black-formatter.interpreter": ["グローバルのpython.exeのパス"]
"flake8.interpreter": ["グローバルのpython.exeのパス"]
設定が必要でした。
「グローバルの python.exe」と言っているのは、C:\Users\admin\AppData\Local\Programs\Python\Python311\python.exe
のことです。
注意:ユーザーやバージョン、インストール時の指定によって異なります。
したがって、今回は、以下のような設定になります。
注意:\
は、\\
で記述します。
{
"terminal.integrated.env.windows": {
"PSExecutionPolicyPreference": "RemoteSigned"
},
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
},
"flake8.args": [
"--max-line-length=88",
"--ignore=E203,W503,W504"
],
"black-formatter.interpreter": [
"C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python311\\python.exe"
],
"flake8.interpreter": [
"C:\\Users\\admin\\AppData\\Local\\Programs\\Python\\Python311\\python.exe"
]
}
イヨッシ!
SSH 先 Linux の場合
【確認環境】
Visual Studio Code 1.81.1(Windows - Linux ssh リモートデバッグ)
Linux(Raspberry Pi Desktop OS)
Python 3.7.3
SSH 接続先 Linux の場合で確認しました。
確認対象の環境は、「VS Code で Raspberry Pi Desktop へ SSH 接続しようとしたらエラーになった」の時と同等です。(black, flake8 はインストールしていません。)
SSH 接続先 Linux の場合、SSH 接続先に拡張機能のインストールが必要になります。
まず、非 venv 環境のディレクトリにて、以下の設定を行いましたが、black が動きませんでした。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
},
"flake8.args": [
"--max-line-length=88",
"--ignore=E203,W503,W504"
]
}
YYYY-MM-DD hh:mm:ss.670 [info] /usr/bin/python3 -m black --stdin-filename /home/pi/notvenv/hello.py -
YYYY-MM-DD hh:mm:ss.670 [info] CWD formatter: /home/pi/notvenv
YYYY-MM-DD hh:mm:ss.670 [info] The typed_ast package is required but not installed.
You can upgrade to Python 3.8+ or install typed_ast with
`python3 -m pip install typed-ast`.
python3 -m pip install typed-ast
をやってみます。
$ python3 -m pip install typed-ast
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Requirement already satisfied: typed-ast in /usr/lib/python3/dist-packages (1.3.1)
python3 -m pip install typed-ast
は、既に適用されているようで、Python3.8 以上が必要そうです。Python-3.8.18 をビルドして、インストールします。
$ wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz
$ sudo tar zxf Python-3.8.18.tgz
$ cd Python-3.8.18
$ sudo ./configure
$ sudo make
$ sudo make install
/usr/local/bin/python3.8 にインストールされたので、以下の設定にします。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
},
"flake8.args": [
"--max-line-length=88",
"--ignore=E203,W503,W504"
],
"black-formatter.interpreter": [
"/usr/local/bin/python3.8"
]
}
これで、OK でした。
ちなみに、Windows 環境の venv と違い、Linux環境 の venv の場合、"flake8.interpreter"
無しで普通に動きました。
Why!?
以上!
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。