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

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 がインストールされているからです。
※あくまでイメージです。

VS Code 独自環境 black, flake8 イメージ図


black, flake8 のバージョンは、
コンソールの
出力Black Formatter
出力Flake8
で分かります。

blackのバージョン


flake8のバージョン


拡張機能インストール

導入を開始します。


拡張機能
Black Formatter
Flake8
をインストールします。


各々検索して、Microsoft 公式拡張機能をインストールします。

Black Formatterインストール


Black Formatterインストール後


Flake8インストール


Flake8インストール後


今回の場合、バージョンは、
Black Formatter v2023.4.1 プレビュー
Flake8 v2023.6.0 プレビュー
でした。


Flake8 設定

ここでは、一旦、特に問題が発生しない非 venv 環境:C:\notvenv で説明していきます。


後でチェックルールを調整する設定を行いますが、動かすだけの場合、何もする必要はありません。
hello.py を開くと、既に指摘がありました。
no newline at end of file Flake8(W292)
(最終行に空白行があるべきという指摘)

no newline at end of file


Black 設定

保存されたときに、フォーマッタが発動するように、 設定Editor: Format On Save にチェックを入れます。

Format On Save


Format On Saveチェック後のsettings.json


右上の

JSONアイコン

のアイコンをクリックすると、settings.json が表示されて、

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" 設定と等価と解釈)

2023.20.0の差分メッセージ部分

Python拡張機能 v 2023.20.0 未満の場合は、必要です。

hello.py (任意の Python プログラム)を保存すると、
「Black フォーマッタ拡張機能がインストールされていますが、それを既定のフォーマッタとして使用しますか?」
のメッセージが現れますので、はい をクリックします。
クリック直後は、一旦無視されますが、もう一度保存すると、black が発動して、フォーマットされます。

black が発動して、フォーマット 動画


上記メッセージの はい をクリックした結果、
.vscode\settings.json
に以下の設定が自動追加されます。
これは、上記メッセージを無視して、手動で書いても同じことです。

.vscode\settings.json
{
    "[python]": {
        "editor.defaultFormatter": "ms-python.black-formatter"
    },
    "python.formatting.provider": "none"
}

フォーマッタ設定後のsettings.json


意味は、カレントワークスペース(フォルダ)にて、 python プログラムを開いた場合、フォーマッターとして、拡張機能の Black が有効になるという意味です。
先ほど、ユーザー毎の設定の方に、
"editor.formatOnSave": true
を設定しましたが、この設定もユーザー毎の設定にしても構いません。ユーザー毎の設定にした場合、打ち消さない限り、python プログラムは常に自動フォーマットされます。


ところで、この設定の内、
"python.formatting.provider": "none"
で警告が表示されます。

python.formatting.providerの警告


設定を消しても特に問題なさそうでしたので、消すことにします。

.vscode\settings.json
{
    "[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" で指定します。
今回は、ユーザー毎ではなく、ワークスペース固有の設定とします。

.vscode\settings.json
{
    "[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")

【設定前】
flake8設定前のエラー


【設定後】
flake8設定後エラーなし


ヨシ!


venv の場合

続いて、
venv のワークスペース
C:\work\venvname
にて、以下の設定を行いました。
"editor.formatOnSave": true は、ユーザー毎の設定のため、設定済みで、理論的には、これだけで動作するはずです。

.vscode\settings.json
{
  "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

となっていて、スキップされたようです。

Skipping standard library file

画像は、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
のことです。
注意:ユーザーやバージョン、インストール時の指定によって異なります。


したがって、今回は、以下のような設定になります。
注意:\ は、\\ で記述します。

.vscode\settings.json
{
  "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"
  ]
}

black-formatter.interpreter、flake8.interpreter設定

イヨッシ!


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 接続先に拡張機能のインストールが必要になります。

SSH 接続先に拡張機能のインストール イメージ図


SSH 接続先にblackインストール


SSH 接続先にflake8インストール


まず、非 venv 環境のディレクトリにて、以下の設定を行いましたが、black が動きませんでした。

.vscode/settings.json
{
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
  },
  "flake8.args": [
    "--max-line-length=88",
    "--ignore=E203,W503,W504"
  ]
}
コンソール→出力→Black
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 にインストールされたので、以下の設定にします。

.vscode/settings.json
{
    "[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" 無しで普通に動きました。

venv flake8.interpreter設定無しで問題無し


Why!?


以上!

loading...