😇

Pythonで開発するときのおすすめVSCodeプラグインと設定

2024/06/27に公開

はじめに

最近ちょっと環境構築し直すことがあったので、主に自分がVSCodeでPythonを使って開発するときの便利プラグインとか機能とか設定とかをつらつらと書いてゆきます。

バージョン管理とかパッケージ管理ツールには触れないのでお好みで。
最近はryeとuvが人気?

他に何か便利なツールとかこういう設定入れるといいよ!とかがあればぜひ。

Workspace

Workspaceは要するに1つ以上のフォルダを同時に開く機能です。
特にモノレポなんかだとバックエンドとフロントエンドが混在していたり、あるいは複数アプリが混在していて必要なフォルダだけ同時に開きたい、みたいなときにworkspaceとして保存しておくと便利です。
https://code.visualstudio.com/docs/editor/workspaces

Profile

設定やプラグインをまるっと名前をつけて保存する機能です。
これを分けないと入れたプラグインが全環境で全部動くので大変重くなります・・・。
特に開発環境ごとに分けると便利です。
自分の場合は、Pythonを書くときはこのProfile、Reactを書くときはこのProfile・・・
みたいに分けています。
またWorkspaceで使っていたProfileは記憶されるので、次に開くときも最後に使用していたProfileが自動的に読み込まれます(超便利)。

https://code.visualstudio.com/docs/editor/profiles

プラグイン

Python

これが無いと始まらない。
https://marketplace.visualstudio.com/items?itemName=ms-python.python

Pylance

これも。
https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance

Python Debugger

これも。
https://marketplace.visualstudio.com/items?itemName=ms-python.debugpy

Github

これも。
https://marketplace.visualstudio.com/items?itemName=KnisterPeter.vscode-github

indent-rainbow

インデントがキレイ・・・ではなく見やすくなります。

https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

Code Spell Checker

Typoしたときに指摘してくれます。
デフォルトは英語のみ。多言語用のパッケージがあります。
https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker

Flake8

Linter & formatter三種の神器。
最近はRuffもあるのでお好みで。

https://marketplace.visualstudio.com/items?itemName=ms-python.flake8

Black

同じく。
https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

isort

同じく。
https://marketplace.visualstudio.com/items?itemName=ms-python.isort

Formatting Toggle

一時的にフォーマッタ止めたいなってときにボタンでON/OFFを切り替えられるようになります。
https://marketplace.visualstudio.com/items?itemName=tombonnike.vscode-status-bar-format-toggle

Git Lens

blame見たり、PRに飛んで確認したり色々出来ます。
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

Error Lens

普段はカーソルを当てないと表示してくれない赤や黄色等のハイライト(ErrorとかWarnとか)の内容を行末に表示してくれるようになります。見やすい。

https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens

Docker

DockerDesktopでもいいですがこちらのほうが色々操作しやすいので。
https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker

Github Pull Request

一々ブラウザ開いてレビューとかPR作るのめんどいなーってときに使ってます。
https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github

IntelliCode

メソッドとか色々サジェストをしてくれます。
Copilotみたいにガバっとコード書いてくれるわけではないですが割と助かる。
https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode

IntelliCode API Usage Examples

このメソッドどうやって使うんだっけ?みたいなときにぱっと使い方を確認出来ます。
最近はIntellicode入れると自動ではいるかも?

https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.intellicode-api-usage-examples

Github Copilot

いわずもがな。
https://marketplace.visualstudio.com/items?itemName=GitHub.copilot

Thunder Client

割と使いやすかったので他のRestClientから乗り換えました。
APIの確認とかで便利。
https://marketplace.visualstudio.com/items?itemName=rangav.vscode-thunder-client

Todo Tree

プレフィックス付けたコメントをまとめて確認出来ます。
わー、FIXMEがいっぱい~なんて感じに。
https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree

YAML

PythonだとYAMLを触ることも多いので。
https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml

Mypy Type Checker

Mypyを使うなら。
https://marketplace.visualstudio.com/items?itemName=ms-python.mypy-type-checker

Django

Djangoを使うなら。django-templateは普通のHTMLと異なるのでシンタックスが効くと地味に嬉しいです。
https://marketplace.visualstudio.com/items?itemName=batisteo.vscode-django

Python Path

たまにサジェストに出ないものがあるときに直接クラスやモジュールからパスをコピーしてこれます。
https://marketplace.visualstudio.com/items?itemName=mgesbert.python-path

settings.json

profileで分けちゃうので基本はUserSettingsに書いてます。
プロジェクトが巨大になってきてから、VSCodeを開いて解析が走る数分が重くてしかたなかったのでpython.analysis周りの設定で調整してました。

settings.json
{
  // general settings
  "editor.suggestSelection": "first", // 最初の項目にフォーカスをあわせる
  "editor.acceptSuggestionOnEnter": "off",  // enterで選択するのをオフ(改行と被るので)
  "editor.formatOnSave": true,
  "editor.formatOnPaste": true,
  "editor.formatOnType": true,
  "files.trimTrailingWhitespace": true, // 余計な空白を削除
  "editor.accessibilitySupport": "off" // 音をオフに
  "editor.inlineSuggest.suppressSuggestions": true,
  // general plugins
  "workbench.iconTheme": "vscode-icons",
  "cSpell.language": "en,en-GB",
  "cSpell.userWords": {
    "django",
    "Impl",
  ], // スペルチェッカーで無視する単語
  "todo-tree.general.tags": [
    "BUG",
    "HACK",
    "FIXME",
    "TODO",
  ],
  // python
  "python.analysis.indexing": true,
  "python.analysis.autoSearchPaths": true,
  "python.analysis.autoImportCompletions": true, 
  "python.analysis.diagnosticMode": "openFilesOnly", // 解析が重くなるので開いているファイルに限る
  "python.analysis.include": [
    "piyo_app",
    "test_utils",
  ], // extraPathsで追加するとかexcludeでも
  "python.analysis.userFileIndexingLimit": 6000, // file数が膨大だと重くなるので制限
  "python.analysis.packageIndexDepths": [ // デフォルトは深くまでインデックスしないのでよく使うやつだけ深くする
    {
      "name": "django",
      "depth": 2
    },
    {
      "name": "rest_framework",
      "depth": 2
    },
    {
      "name": "fastapi",
      "depth": 2
    },
  ],
  "flake8.args": [
    "--max-line-length=120",
    "--enable=W0614",
    "--ignore=E231"
  ],
  "black-formatter.args": [
    "--line-length=120",
    "--skip-string-normalization"
  ],
  "python.testing.pytestEnabled": true, // pytestをON
  // formatter and style
  "[python]": {
    "editor.defaultFormatter": "ms-python.black-formatter",
  },
  "[json]": {
    "editor.defaultFormatter": "vscode.json-language-features",
    "editor.tabSize": 2 // 地味にタブサイズが4とかになるので
  },
  "[html]": {
    "editor.tabSize": 2
  },
  "emmet.includeLanguages": {
    "django-html": "html", // django-htmlはhtmlと見なすッ
  },
  "editor.inlineSuggest.enabled": true,
  "git.confirmSync": false,
  "githubPullRequests.pullBranch": "never",
  "githubPullRequests.fileListLayout": "tree",
  "files.associations": {
    "*.html": "html"
  },
  "git.autofetch": true,
}

launch.json

これはdjango用ですが、たまにライブラリの中でそもそもどうなってるのか見たいことがあるので、justMyCodeをfalseにしておくとライブラリ等でbreakpointが張れるので便利です。

launch.json
{
  "name": "Python: Django",
  "type": "debuggy",
  "request": "launch",
  "args": ["runserver", "0.0.0.0:8000"],
  "django": true,
  "justMyCode": false, // ライブラリなどのコードにBreakPointを張れるようになる
  "env": {"PYDEV_WARN_EVALUASTION_TIMEOUT": "300"}
}

Omake

direnvとvenvで環境をクリーンにする

割とプロジェクト内でバージョンを切り替えて作業することもあるので、direnvとpyenvを組み合わせてバージョン変更した場合にvenv環境も切り替わるようにしています。

以下のように.envrcに指定しておくと、pyenv local 3.12とか打って新しくシェルを立ち上げると3.12で新しくvenv環境が作られて切り替わります。
Pythonのバージョンを上げるときなどに環境を汚染せずに切り替えられるので結構便利です。

.envrc
layout pyenv `cat .python-version`

Discussion