1. 概要
今までVSCodeの setting.json
に書いてきた Python linter 関連の設定方法が 非推奨になっている ことに気がついた。
そこで、新しい設定方法を調べて以下に書きました。
この記事の対象のlinterは以下の通り。
- flake8
- black
- mypy
- isort
- ruff (2023/12/05 追記!!)
2. 結論
-
setting.json
の書き方が変わるよ -
flake8
,black
,mypy
,isort
,ruff
については、pip install
とかしなくていいから、VSCode拡張を入れてね
3. 実行環境
以下の環境で動作確認したよ。
気付いたのだけど、本記事での設定は、Macではうまく機能するのに、Windows WSL2 上では全く動作していない。
ちなみに、現状はこう。
ローカルマシンOS | 接続先リモートサーバOS | 動作結果 | 備考 |
---|---|---|---|
Mac | なし (ローカルホスト) | 動いた | ※Apple M2 で Ruff 利用時は注意が必要!!詳細は「9.」を参照 |
Mac | リモートのUbuntu | 動いた | |
Windows | WSL2 Ubuntu | 動いた | 厳密にはWSL2はリモートと呼ぶには怪しいが、WSLは仮想マシンということでリモートマシンという扱いにした。 |
WSL でも動作させる方法がわかったので、色々と追記した。(2023/10/14)
4. 旧設定方法について
ネットで検索すると、大体 python.formatting.xxx
とか、 python.linting.xxx
とかの設定を書くように説明されている記事がヒットする。
自分もそれらに従って、以下のような setting.json
を使っていた。
{
"python.formatting.provider": "black",
"python.formatting.blackPath": "${workspaceFolder}/.venv/bin/black",
"python.languageServer": "Pylance",
"python.linting.enabled": true,
"python.linting.lintOnSave": true,
"python.linting.mypyEnabled": true,
"python.linting.mypyArgs": [
"--ignore-missing-imports",
"--config-file",
"pyproject.toml"
],
"python.linting.mypyPath": "${workspaceFolder}/.venv/bin/mypy",
"python.linting.flake8Enabled": true,
"python.linting.flake8Path": "${workspaceFolder}/.venv/bin/flake8",
"python.linting.pylintEnabled": false,
}
しかし最近、この設定では以下のような warning が出てしまうようになった。
この設定は間もなく非推奨になります。Mypy Type Checker 拡張機能を使用してください。詳細については、「https://aka.ms/AAlgvkb」を参照してください。
これは "python.linting.mypyPath"
にカーソルを合わせた時の warning だけど、他のも同様に非推奨と言われている。
...いや、実を言うと warning だけではなくて、自分の場合はそもそも mypy
, isort
が動かなくなっていた(。ŏ﹏ŏ)
5. 新設定方法
- VSCodeの拡張を install しましょう!
- setting.json に書いていた古いlinter設定は消しましょう!
- Windwos (WSL) の場合は、 8. 各linter設定のカスタマイズ が必須
以下で詳しく見ていきます。
5-1. VSCodeの拡張を install
上記画像で示したテキスト入力欄に、 flake8
や mypy
と入れると、Microsoft公式の拡張が見つかります。
具体的には以下の4つの拡張を入れました。
名称 | 識別子 |
---|---|
Black Formatter | "ms-python.black-formatter" |
Flake8 | "ms-python.flake8" |
isort | "ms-python.isort" |
Mypy Type Checker | "ms-python.mypy-type-checker" |
Ruff 使いたい人は以下を入れてね (*´v`)
名称 | 識別子 |
---|---|
Ruff | "charliermarsh.ruff" |
Ruff 使う場合は、black
とか isort
はいらないかも。
5-2. 古いlinter設定削除
「3. 旧設定方法について」に書かれていたような非推奨設定を全て消せば、最新の設定方法の完了です!(windows (WSL
) の場合は「5-3.」も必要 )
これで、動かなくなっていた私のlinterも全て復活しました!
※念のためもう一度書きますが、上記のlinter分に関しては、非推奨になっている古い設定は全て消しましょう。
消さないと、VSCodeは古い方のlinterを動かそうとします。
5-3. WSL の場合
8. 各linter設定のカスタマイズ の作業が必須なようです。
少なくとも私の場合、この設定を行わないと WSL 上の mypy
、black
、isort
については動作しませんでした。( ˘·ω·˘ ).。oஇ
5 の補足
linter パッケージの扱いについて
ここまでの内容を実施すると、 flake8 や mypy を LocalマシンのOS から uninstall しても linter が動くようになります。
VSCode拡張の中に、 linter のコードも含まれているからです。
これにより、Pipfile
や requirements.txt
に linter のパッケージを追加する必要はなくなります。
6. lintのエラー確認方法
それでもlinterが動かないときは、以下の画像内の矢印の先にある {}
マークをクリックすることで、各lintツールのエラー原因を確認できます。
ここでログを確認できるのは、おそらくVSCode拡張をインストールした分だけだと思います。
7. isort設定の補足
ちなみに、 isort
の以下の設定については、非推奨にはならなかったのだけど、
{
"isort.path": [
"${workspaceFolder}",
".venv",
"bin",
"isort"
],
}
私の環境でこれを設定すると、
なぜか「対象ディレクトリにアクセスする権限がない」(PermissionError: [Errno 13] Permission denied:
)という以下のようなエラー
2023-08-04 10:02:34.570 [info] Error while detecting isort version:
Traceback (most recent call last):
File "/Users/user_name/.vscode/extensions/ms-python.isort-2023.10.1/bundled/tool/lsp_server.py", line 419, in _log_version_info
result = _run_tool(["--version-number"], settings)
File "/Users/user_name/.vscode/extensions/ms-python.isort-2023.10.1/bundled/tool/lsp_server.py", line 690, in _run_tool
result = utils.run_path(argv=argv, use_stdin=True, cwd=cwd)
File "/Users/user_name/.vscode/extensions/ms-python.isort-2023.10.1/bundled/tool/lsp_utils.py", line 157, in run_path
with subprocess.Popen(
File "/Users/user_name/.pyenv/versions/3.10.11/lib/python3.10/subprocess.py", line 971, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "/Users/user_name/.pyenv/versions/3.10.11/lib/python3.10/subprocess.py", line 1863, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
PermissionError: [Errno 13] Permission denied: '/Users/user_name/src/repository_root'
が出て、isortが効かなくなっていました。
そのため、私はこの設定も消しました。
そしたらなぜか isort
が動きました。
"isort.path"
も非推奨でいいんじゃないかな...?( ˘·ω·˘ ).。oஇ
8. 各linter設定のカスタマイズ
Windows (WSL) の場合は、以下の設定が必須っぽいです。
8-1. flake8
flake8
に関しては、こんなふうに書いたら、設定が効いた。
{
"flake8.args": [
"--max-line-length=100",
"--max-complexity=10",
"--config=<file_path>"
],
}
--config=
は試してないけど、 VSCode の公式 document に載っていた事例なので、おそらく効くだろう。
flake8設定に関する公式 document のリンクも以下に貼っておきます。
8-2. mypy
mypyはこう。
{
"mypy-type-checker.args": [
"--ignore-missing-imports",
"--disallow-untyped-defs",
"--config-file=<file>"
]
}
--config-file
のところは、各自自分の設定ファイルを書いてね(試してない)。
mypy設定に関する公式 document のリンクは以下の通り。
8-3. black
とりあえず、black の最低限の設定。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true
}
}
black の設定に関する公式 document のリンクは以下の通り。
8-4. isort
isort の設定だよ。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
},
"isort.args":["--profile", "black"],
}
isort の設定に関する公式 document のリンクは以下の通り。
8-5. 完成形 (windows 用 flake8, mypy, black, isort 対応)
これで、windows でも flake8、mypy、black、isort が動くようになる。
{
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
},
"isort.args":["--profile", "black"],
"flake8.args": [
"--max-line-length=100",
"--max-complexity=10",
],
"mypy-type-checker.args": [
],
}
"--config=<file_path>"
や "--config-file=<file>"
は別に要らない。
mypy に関しては、設定項目が上記のような空配列であっても動作することが確認できた。
9. Ruffについて (new!!)
Ruff の設定方法を追記しました。
black や isort (、flake8 とも?) などと機能が重複しているので、別枠にしてあります。
9-1. Mac の場合の注意事項
Mac OSの場合 error: Ruff crashed.
といったエラーが発生する場合がある。
発生した環境は以下の通り。
バージョンなど | |
---|---|
OS | macOS Ventura 13.6(22G120) |
CPU | Apple M2 |
この場合、OSに Rust
をインストール必要がある気がする...よくわかってない(未対応)
関連があると思われる GitHub issue を載せておく。
自分の場合は、いつの間にかこのエラーが解消してしまっていて、エラーも再現できないので、対策を明示できません。(申し訳ない...)
もし何かわかればコメントいただけるとありがたいです。
9-2. install する extension
もう1回書いておくね。
これだよ。
名称 | 識別子 |
---|---|
Ruff | "charliermarsh.ruff" |
9-3. settings.json の設定
以下のように書いてね。
この設定で ruff が動いたよ ( *˙︶˙*)و
※ 2024/03/11 追記: 要注意
-
"source.fixAll.ruff"
,"source.organizeImports.ruff"
がtrue
じゃなくて、"explicit"
になったかも。余裕がなくて調べられてないけど、後で調べて更新したい。
{
"[python]": {
"editor.codeActionsOnSave": {
"source.fixAll.ruff": true,
"source.organizeImports.ruff": true
},
"editor.formatOnSave": true,
}
}
windows でも Mac でも、設定に関しては少なくともこれで動きました。
Ruff の設定方法詳細は、以下の公式ドキュメントに書かれているよ。
(上記2つのサイトは、どちらもほぼ同じことが書かれている。)
9-4. Ruff の機能について
以下のサイトに結構詳しいことが書かれているよ。
9-5. Ruff について感じていること
Ruff は、 flake8 の何十倍も速いと言われているし、 isort1、black2、flake83 の機能は大体カバーしている模様。なので、この3つはもう置き換えてもいい気がする。
ただ、mypy の機能まではカバーしてない4みたい( ˘ω˘)
mypy 結構好きなので、mypy はこれまで通り使うつもり。
-
mypy と ruff の互換性について (互換ではないので、mypy は Ruff とセットで使うのがオススメ) ↩