【2024年版】VSCodeでPythonを効率的に開発する上での便利な拡張機能まとめ【随時更新】【Pythonプログラマ必見】

## はじめに
アドカレ初参加で記事書いてみるの意外と面白かったので何個か書いてみてます！
普段そこまで拡張機能使えてないんですが使えた方が効率的(後かっこいい:money_mouth:)ので今回はPython書く上で役立ちそうな拡張機能について調べてみました！

他にもこんなのあるよとかここ違うとかこれ古いで〜とかあればぜひ教えてください！:open_mouth:

## インストール方法(念のため)
VSCode拡張マーケットで「対象の拡張機能」で検索し、インストールします。
<img width=300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/c47477b8-45cb-2a6a-1e04-d6207808510d.png">


## ほぼ必須？みんな入れてるかもだけど一応紹介
### Python (Microsoft公式拡張機能)
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/82821741-6891-952a-b2c1-d6620b3c11f3.png">

この拡張機能はpython開発をサポートしてくれる拡張機能です。
多分Python書いてたら右下にこれ入れる？？って最初に出てくるようなもので
以下のような基本的なサポートをしてくれる拡張機能となっています！
・コード編集
・コードのエラーチェック
・フォーマット　等

これ入れると一緒にPylance、Python Debuggerも一緒にインストールされます！
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/37cea479-18fa-b591-0555-a8d5fc687f57.png">

### Japanese Language Pack for Visual Studio Code
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/f308160a-30a4-8b94-98ec-f4f2a8235dbc.png">

この拡張機能はVSCodeのUIを日本語化する拡張機能です。
デフォルトだと英語表記でよくわからんところとか多いのでみんなとりあえず入れてるものかな？？というやつです！

## ここから本題便利な拡張機能

### intelliCode
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/f2e98e75-fd0e-2f11-1d0d-10916102f275.png">

この拡張機能はAIを活用した補完機能で、よりコンテキストに合った候補を提示してくれるものです。
とりあえず入れといても損はないかも？:point_up:

### GitHub Copilot
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/f677b767-4bfd-f969-da55-9bc3930f8000.png">
この拡張機能はコードの入力をリアルタイムに解析し、ユーザーの入力補助等の機能を提供します。

例えばコード補完などは以下のように途中まで入力してみると残りの部分(若干グレーの部分)をサンプルで提供してくれます。
<img width=450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/d581d93f-9eb0-c532-41e8-be151b216f00.png">

関数のdocstringを書くときも自動で補完してくれます！
いっつも書くの忘れて困るから助かる、、、
<img width=450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/d530b591-43d3-24e1-5f89-9e73cc4fbb2b.png">

こちらは有料プランに登録したりそれに伴いGitHubのアカウントとの連携が必要だったりで業務上は自由に使えないこともあるかもしれません:frowning2:
ただ最初は無料プラン(30日)とかあったりするのでお試しで使ってみてください！

### Trailing Spaces
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/900468f3-0f94-1a0d-8c7b-a21a0cf6f762.png">

この拡張機能はコードの末尾にあるスペースを可視化してくれるものです。

コピペとか調整とかで半角スペースが入ってしまうのはみんな経験あると思います。
実際スペース入ったからエラーが起きるわけではないですが、不要なものは消した方が良いです！
特に半角スペースは普通に書いてもなかなか気づかないけど赤表示↓されるので見つけやすくなります！
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/8fb35ae9-435d-a512-9877-4cf2733ad28e.png">

### Black Formatter
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/9664d794-c36f-7dec-32ab-71b95e8a53bb.png">

この拡張機能はPythonのコードを自動的に整形してくれるものです

#### 整形するための設定
.vscode/setting.jsonファイルに以下のように記載します。
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/bdd6b52d-cf5a-72ae-3f56-f234f4ddeac6.png">

```json
{
    "[python]": {
        // 拡張機能の場合には以下のような指定
        "editor.defaultFormatter": "ms-python.black-formatter",
        // ファイルを保存すると自動でフォーマットする
        "editor.formatOnSave": true
    },

}
```

#### 整形結果
例えばこういうようなコードがあった場合の修正前後は以下となります。
修正前:

<img width=450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/dc514219-80c7-0b56-4421-9b9aeec35ef7.png">

修正後:
<img width=450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/0a1bc72f-9b9d-b647-a2ee-8bdd49177ff0.png">

配列やインデントなどを自動で調整してくれました:relaxed:

細かい設定があんまりできなかったりしますがとりあえず入れてみるのもありかも？

### Python Test Explorer for Visual Studio Code
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/19f1a452-deb8-6adc-460d-a9237c96758f.png">

この拡張機能はPytestなどのユニットテスト周りをVSCode上で実行できるものです。
テスト駆動開発(TDD)が容易になり、失敗したテストを素早く特定・修正可能になります！


なんかややこしかったのでVSCode側でのテスト環境の準備をしてみます。
### 1.VSCodeの左側のタブのpytestを選択し、「Configure Python Tests」というボタンを選択
<img width=350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/b3ace5b2-d485-4bac-b967-800a4626551c.png">

### 2.テストのフレームワークを選択するように言われるので今回は「pytest」を選択
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/adca0bf1-b0b4-c3c8-0193-fd9e33f7fcfe.png">

### 3.テストケースファイルが含まれているディレクトリを選択
今回はテストケースファイルは「test」フォルダに置くことにします。
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/9642c7c3-3513-59db-10f7-1807b18bee37.png">


何も入れてないのでこんな表示になると思います。
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/ca73aa5d-5f9c-01a3-3fc9-978b50299048.png">


### 4.テストケースファイルを用意
#### テスト対象ファイル:backend/caluculate.py
```python
def add(a: int, b: int) -> int:
    """2つの整数を加算する"""
    return a + b

def subtract(a: int, b: int) -> int:
    """2つの整数を減算する"""
    return a - b

def multiply(a: int, b: int) -> int:
    """2つの整数を掛け算する"""
    return a * b

def divide(a: int, b: int) -> float:
    """2つの整数を割り算する (0除算時は例外を発生)"""
    if b == 0:
        raise ValueError("除数は0以外でなければなりません")
    return a / b
```
#### テストコード:test/test_caluculate.py
```python
import pytest
from backend.caluculate import add, subtract, multiply, divide

def test_add():
    assert add(3, 2) == 5
    assert add(-1, 1) == 0
    assert add(0, 0) == 0


def test_subtract():
    assert subtract(3, 2) == 1
    assert subtract(2, 3) == -1
    assert subtract(0, 0) == 0


def test_multiply():
    assert multiply(3, 2) == 6
    assert multiply(-1, 2) == -2
    assert multiply(0, 100) == 0


def test_divide():
    assert divide(6, 2) == 3.0
    assert divide(5, 2) == 2.5

    # 例外発生テスト
    with pytest.raises(ValueError, match="除数は0以外でなければなりません"):
        divide(10, 0)

```
ついでにpytestもインストール
```
python3 -m venv venv  
source venv/bin/activate
pip install pytest
```
※仮想環境にインストール後VSCode上のインタープリターで↑で作ったやつ選択しておく
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/0f07f9a7-4190-082e-c86d-036702807298.png">


うまいこと準備できたらこんな表示になるはず！
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/9b803ae9-1714-4f08-7ce9-0fa130e71dc6.png">

テスト実行するとテスト結果が出てくるよ！
100%だとこんな感じ
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/7051d3de-11ba-a78b-da68-a73ed943ae6f.png">

期待値を変えてみるとNGの対象箇所がわかるよ!
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/bcb7ffe1-034a-1c2d-43d4-c806bb8edcda.png">


普通に実行したGithubActionsとかで実行したりもするけど
書いてる時にある程度試せるし試しやすいから便利:point_up:


## Ruff
<img width=650" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/b7f9c912-eede-c4f6-801a-9d746353ab39.png">

この拡張機能は、 Flake8 (および数十のプラグイン)、 Black、isort、 pydocstyle、pyupgrade、 autoflakeなどを置き換えるのに使用できるものです。
コメントで教えていただいて初めて知ったのですが、上の方で紹介した整形周りも統合されてるようなのでこいつでひとまとめにしてしまっても良いかもですね！

### 整形するための設定
.vscode/setting.jsonファイルに以下のように記載します。
<img width=450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/28bb29aa-9bf1-f4dc-f976-52945688a415.png">

```
{
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
        "source.fixAll": "explicit",
        "source.organizeImports": "explicit"
    },
    "editor.defaultFormatter": "charliermarsh.ruff"
}
```

・プロジェクト直下にpyproject.tomlを作成して、以下のように設定します。
<img width=250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/0de3d3fd-e8f3-bbfa-de92-25f0760ba76d.png">

```yml
[tool.ruff]
exclude = [
    ".venv",
    ".ruff_cache"
]
indent-width = 4

[tool.ruff.lint]
select = [
    "F", # Flake8
    "B", # Black
    "I", # isort
    "E", # error
    "W"  # warning
]
ignore = []
fixable = ["ALL"]
```

例えば変なスペースとか不要なインポートがある以下のpythonも整形してくれます
#### 修正前
<img width=550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/05b65a90-6d89-3c33-f970-c1c0d49fa6c5.png">

#### 修正後
<img width=550" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/91772921-636e-cb0c-53fd-3e9f4bab56e4.png">


## まとめ
調べてみるととんでもない数の拡張機能があったのと使ったことないやつばかりで全然書き切れないですが、
最初にも書いた通りこれ使ってるとかこれ古いよとかあったらぜひ教えてください！:santa_tone1: