【VSCode】Pythonの入力補完（自動補完）設定

コーディングする際に，インデントやスペルミス等による（しょうもない）バグを回避するためには，エディタの入力補完（自動補完）機能の利用が必須です．
特に，Pythonのようなインタプリタ言語では，プログラムを実行しないと（あるいは実行してエラーが表示されても）ミスに気づかないことが多くあるので，利用しない手はありません:wink:

本投稿では，VSCode（Visual Studio Code）でPythonの入力補完を設定する手順を（投稿者自身の備忘録を兼ねて）説明してきます．
（PythonとVSCodeのインストール方法についても紹介していきます）
ここで，入力補完には大きく分けて次の2種類あり，今回はその両方をカバーするように設定していきます．

- プログラム言語の構文（if文やwhile文・関数定義等）に関するもの
    - プログラミング言語（Python）の仕様に沿って補完を行う．
    - 例）ifと入力したら，if文やif-else文の型を自動補完してくれる．
- 実装プログラムの構造（モジュール/クラスと，その中で定義されている定数や関数/メソッド等）に関するもの
    - 実装したプログラムを分析することで補完を行う．
    - 例）モジュール名を入力しドット（.）を入力したら，そのモジュールで定義されている定数や関数の候補を表示してくれる．

:::note info
インフォメーション
入力補完の設定は少し面倒かもしれませんが，一度設定すれば快適にPythonコーディングすることが可能です．
:::

# Pythonのインストール

PythonをPCにインストールする手順については，[こちらのサイト](https://oku.edu.mie-u.ac.jp/~okumura/python/install.html)の「公式サイト Python.org からのインストール」を参考に行なってください（WindowsとMacの両方に対応しています）．


:::note info
インフォメーション
以降は，PCにPython（Python3）とpip（あるいはpip3）がインストールされていることを前提に設定をしていきます．
ただし，Pythonパッケージの保存場所がわかっていれば，それ以外の方法でも入力補完の設定を行うことができます．
:::

# VSCodeのインストール
VSCode（Visual Studio Code）はMicrosoft社が開発しているエディタ（テキスト編集ソフト）で，次のような特徴があります．

- オープンソース
    - 誰でも無償で利用可能です．
- 多くのオペレーティングシステムに対応
    - Windows，MacOS，Linuxなど，多くのOSに対応しています．
- 拡張機能が豊富
    - Pythonに限らず，様々なプログラミング言語/ツールに対応した拡張機能が提供されています．

[こちらのサイト](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)から「今すぐダウンロード」をクリックすることで，PCにVSCodeを簡単にインストールすることができます．
今回は，Pythonの拡張機能（後述）を活用して，入力補完の設定をしていきます．


# VSCode拡張機能のインストール
VSCodeに，Pythonプログラムを実装するために必要な拡張機能"Python（Microsoft）"をインストールしていきます．
下記拡張機能名をクリックし，サイトから"install"するか，VSCodeの「拡張機能」から[拡張機能名を検索](https://www.python.jp/python_vscode/windows/setup/install_vscode.html#Python%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)することで拡張機能をVSCodeにインストールすることができます．

- [Python（Microsoft）](https://marketplace.visualstudio.com/items?itemName=ms-python.python)
    - VSCodeでPythonコーディングを行うための基本となる拡張機能です．
    - 例えば，実行ボタン▶︎を押すだけでVSCodeのターミナルから実装したPythonプログラムを実行することができるといった機能があります．
- [Pylance（Microsoft）](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)
    - 実装したプログラムをリアルタイムで分析し，スペルミス（未定義変数等）の指摘や入力補完等を行なってくれます．
    - 2021年の5月にプレビューを卒業し，現在は拡張機能Python（Micosoft）のデフォルトの言語サーバとなっています．
        - なので，前述の[Python（Microsoft）](https://marketplace.visualstudio.com/items?itemName=ms-python.python)に含まれているはずですが，拡張機能一覧に表示されない場合はPylance単体を追加インストールしてください．

# Pythonスニペットの設定

Pythonの構文に関する入力補完（スニペット）を行うための設定をしていきます．
こちらは，以前のPython（Microsoft）の拡張機能にデフォルトで設定されていたのですが，2021年1月のリリースで削除されてしまいました...なので，手動で設定していきます．
Pythonスニペットの設定手順は次の通りです．

1. 設定メニューから「ユーザスニペット」を選択
    - Windowsの場合：ファイル → ユーザ設定 → ユーザスニペット
        - ショートカットキー：`Ctrl + Shift + p` → `snippet`と入力（検索）し「ユーザスニペット」を選択
    - Macの場合：Code → 基本設定 → ユーザスニペット
        - ショートカットキー：`Command + Shift + p` → `snippet`と入力（検索）し「ユーザスニペット」を選択
1. `python`と入力し，`python.json`を選択
1.  python.jsonに[こちらのテキスト](https://github.com/microsoft/vscode-python/blob/2020.12.424452561/snippets/python.json)を貼り付けて保存

:::note warn
注意
python.jsonにテキストが175行分全てコピーして貼り付けられていることを確認してください．
:::

# setting.jsonの編集

最後に，実装プログラムの構造に関する補完を有効化するための設定を次の手順に沿って行なっていきます．
（一部，スニペットに関する設定も含まれます）

1. VSCodeの設定画面を開く
    - Windowsの場合：ファイル → ユーザ設定 → 設定
        - ショートカットキー：`Ctrl + , `
    - Macの場合：Code → 基本設定 → 設定
        - ショートカットキー：`Command + , `
2. 設定画面右上（下記画面の赤枠部分）の「設定(JSON)を開く」から，setting.jsonを開く．
![setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207507/449da833-0f94-7550-68ec-fa378606cefd.png)

3. setting.jsonに下記設定を追加し，保存する．

```setting.json
{
    "editor.snippetSuggestions": "top",
    "editor.suggest.showKeywords": false,
    "[python]": {
        "editor.wordBasedSuggestions": true
    },
    "python.linting.enabled": true,
    "python.languageServer": "Pylance",
    "python.analysis.completeFunctionParens": true,
    "python.analysis.extraPaths": [
      "パッケージの保存場所"
    ],
    "python.autoComplete.extraPaths": [
        "パッケージの保存場所"
    ],
}
```
:::note warn
注意
中括弧（{}）は，JSONファイルの最初と最後に書かれます（「{"hoge":〜, "puge":〜, ... , "foo":〜, }」といった形で書かれます）．
setting.jsonには，上記テキストの中括弧（{}）の中身のみコピーし追記するようにしてください．
また，追記する際に，設定コマンド毎にカンマ（,）が付いているかどうかを確認してください．
:::

ここで，"パッケージの保存場所"は，`pip show pip`（あるいは`pip3 show pip`）コマンドの出力結果のうち"Location"から確認することができます．
投稿者の環境（Windows・Mac）で`pip show pip`を実行した例は，次の通りです（出力結果は，Pythonのバーションやインストール時の設定内容によって異なります）．

- Windowsの場合（コマンドプロンプトで実行）
    - パッケージの保存場所：`c:\users\ユーザ名\appdata\local\packages\pythonsoftwarefoundation.python.3.8_qbz5n2kfra8p0\localcache\local-packages\python38\site-packages`

```
> pip show pip
Name: pip
Version: 21.3.1
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: c:\users\ユーザ名\appdata\local\packages\pythonsoftwarefoundation.python.3.8_qbz5n2kfra8p0\localcache\local-packages\python38\site-packages
Requires:
Required-by:
```

- Macの場合（ターミナルで実行）
    - パッケージの保存場所：`/usr/local/lib/python3.8/site-packages`

```
$ pip3 show pip
Name: pip
Version: 21.1.3
Summary: The PyPA recommended tool for installing Python packages.
Home-page: https://pip.pypa.io/
Author: The pip developers
Author-email: distutils-sig@python.org
License: MIT
Location: /usr/local/lib/python3.8/site-packages
Requires: 
Required-by: 
```

:::note warn
注意
"パッケージの保存場所"は，"/usr/local/lib/python3.8/site-packages"といった形でダブルクォーテーション（"）でくくるようにしてください．
※ シングルクォーテーション（'）を2回連続して入力してもダブルクォーテーション（"）にはならないので気をつけてください．
また，Windows環境で"~\~\~"といったように，スラッシュ（/）ではなくバックスラッシュ（\）で表現されている場合は，setting.jsonに貼り付ける際に"\\~\\~"といった形でバックスラッシュを連続して2回（\\）入力する必要があるので注意してください
※ バックスラッシュ（\）が1つだけ入力されている場合は，警告としてバックスラッシュ記号（\）が赤く色付けされるかと思います．
:::

# 入力補完の動作確認
VSCodeを再起動したのち，Pythonファイル（~.py）を開いて，入力補完が有効化されているかどうか確認していきます．

## if/else文の補完
1. `if`と入力．
1. 候補から`if/else`を選択．
1. if/else文の型が自動補完される．

![snippet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207507/12d227a1-ebc3-c0db-70b7-faf767a90bef.gif)

:::note info
インフォメーション
上記GIFでは，補完されたif-else文の条件を入力する部分には（仮として）「condition」とかかれていますが，conditionという変数は定義されていないため，警告として黄色い波線が表示されます（正しく条件を入力すると波線は消えます）．
警告の表示はPylanceの機能で，この警告（黄色い波線）がなくなるように修正していくと，（スペルミス等によるエラーが発生することなく）スムーズにプログラム実行させることができます．
また，警告やエラーの数/箇所は，VSCodeの画面右下（下記画面の赤枠部分）に表示されます．
:::
![warning.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207507/8c67ad9d-2bc2-e9ec-2dbc-e4f4ce8b9ee7.png)

## numpyモジュールの関数補完

1. numpyモジュールをimportし'np'としたうえで，`np.`と入力．
1. numpyで定義されている定数や関数の候補が表示される．
1. 候補から目的の関数（rad2deg）を選択し補完．

関数の括弧()にカーソルをあてると，その関数の説明が表示されます．
![autocomplete.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207507/0a6df1bc-a9b6-428c-abce-47cd24f12df8.gif)

以上で，VSCodeのPython入力補完の設定は終わりです．
スニペットやPylanceを駆使して，快適なPythonコーディングライフを送ってください:wave:

# 参考サイト
- [Pythonの新しい言語サーバー「Pylance」がプレビューを卒業 ～「Visual Studio Code」でリッチな開発支援を実現](https://forest.watch.impress.co.jp/docs/news/1324425.html)
- [VSCode で def や if 等のスニペットが出なくなったら(Python)](https://itpc.blog.fc2.com/blog-entry-229.html)
- [VSCodeのPythonのスニペット(補完)が無効になってたので復活させるのだ。](https://wp.tekapo.com/2021/01/23/the-python-snippets-in-vscode-had-been-disabled-so-i-m-bringing-it-back/)