[備忘録] VisualStudioCode で Python の環境構築 2021 

# はじめに
Visual Studio Code 上で Python の開発環境を構築したため、備忘録として残しておきます。

# 環境
手元ではWSL2を使って動作確認しています。
他の環境でもパス等の設定を変えれば同等の環境が構築できるはずです。

- WSL2 (Ubuntu 20.04 LTS) on Windows 10 Pro

# 前提
Visual Studio Code と Python の処理系は導入済みであるとします。

# 導入するもの
- [Python](#Python)
- [Pylance](#Pylance) (Language server)
- [flake8](#flake8) (Linter)
- [black](#black) (Formatter)
- [isort](#isort) (Sort imports)
- [mypy](#mypy) (Static type checker)

## Python
まずは、拡張機能を入れていきます。
拡張機能のアイコンから `Python` と検索し、インストールします。
![vscode-python.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44958/de2fec9c-2aef-99e2-3867-cb63630e90b4.png)

インストール後、処理系のパスを設定します。
コマンドパレット ( `Alt + X` ) より `Preference: Open Settings (JSON)` を選択し、JSON の編集画面を開き、以下を追記します。今回設定した、Ubuntu 20.04 LTS だと以下になります。

```json
"python.pythonPath": "usr/bin/python3"
```

※一部の項目は、メニューバーのファイル > ユーザー設定 > 設定から GUI でも設定できます。

## Pylance
先程と同様に、`Pylance` と検索し、インストールします。
将来的には、上記の Python 拡張機能を置き換えていくもののようです。
[Announcing Pylance: Fast, feature-rich language support for Python in Visual Studio Code](https://devblogs.microsoft.com/python/announcing-pylance-fast-feature-rich-language-support-for-python-in-visual-studio-code/)

インストール後、使用する言語サーバとして、Pylance を設定します。
先程と同様に、JSON の編集画面を開き、以下を追記します。

```json
"python.languageServer": "Pylance"
```

## flake8
Linter を導入します。ここでは、flake8 を使用します。
[VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb)

まずは、コンソールから pip で flake8 をインストールします。

```console
$ pip install flake8
```

設定の GUI より、Python > Linting: Enabled のチェックが入っていることを確認します。
デフォルトの pylint を無効にし、flake8 を有効にするため、以下の項目を JSON に追記します。

```json
"python.linting.pylintEnabled": false
"python.linting.flake8Enabled": true
```

また、後述のフォーマッタである black と linter のルールを合わせるため、以下も追記します。
[The Black code style](https://black.readthedocs.io/en/stable/the_black_code_style.html)

```json
"python.linting.flake8Args": [
    "--max-line-length",
    "88",
    "--ignore=E203,W503,W504"
]
```

## black
Formatter を導入します。ここでは、black を使用しますがお好みのもので良いと思います。
[Black: Python のソースコードを自動整形するツール](https://org-technology.com/posts/python-black.html)

まずは、pip からインストールします。

```console
$ pip install black
```

また、JSON に以下の項目を追記して、black を選択します。

```json
"python.formatting.provider": "black"
```

エディタで保存した際、自動でフォーマッタがかかるよう、以下も追記します。

```json
"editor.formatOnSave": true
```

Python でのみ有効にしたい際は、以下のように記述します。

```json
"[python]": {
  "editor.formatOnSave": true
}
```

## isort
`import` 文をソートしてくれます。特に指定をしない限り、拡張機能内部のものを使用するそうです。
ただし、保存した際に自動でソートされるよう、以下の設定を記述します。

```
"editor.codeActionsOnSave": {
    "source.organizeImports": true
}
````

## mypy
型アノテーションに対して、静的解析を行います。
[mypyやっていくぞ](https://qiita.com/k-saka/items/8f05c89f675af219e081)

例によって、pip でインストールします。

```console
$ pip install mypy
```

JSON に設定を記述して、mypy を有効にします。

```json
"python.linting.mypyEnabled": true
```

# おわりに
これで、コーディングに集中できるようになりました。

最後に、インストールコマンドと、設定ファイルの JSON をまとめておきます。

```console
pip install flake8 black mypy
```

```json:setting.json
{
    // Editor
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
        "source.organizeImports": true
    },
    // Python
    "python.pythonPath": "/usr/bin/python3",
    "python.languageServer": "Pylance",
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.linting.flake8Args": [
        "--max-line-length",
        "88",
        "--ignore=E203,W503,W504"
    ],
    "python.linting.mypyEnabled": true,
    "python.formatting.provider": "black",
}
```