delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

VS CodeでPylanceを試してみる

概要

数ヶ月前からVS CodePythonのProjectを開くと「Pylanceという拡張機能をインストールしますか?」というポップアップが表示されるようになった。

f:id:kamatimaru:20201227081409p:plain

  • まだpreview版らしい。
  • どんな機能が追加されるのか把握できてない。
  • 今のVS CodeのPython開発環境に特に不満がない。

ので、仕事中にインストールしてかえって環境が壊れたりしたら嫌だなと思ってインストールしていなかったが、年末年始の機会に試してみた。

どんな機能が追加されるのか

以下の公式ドキュメントに主な機能の一覧が書いてある。
marketplace.visualstudio.com

字面だけ見ると、docstringとかimportとか、コード補完系の便利そうな機能が色々並んでいる気がする。

また、以下のブログに貼られている動画からいくつかの機能のデモを見ることができる。
devblogs.microsoft.com

インストール&有効化する

インストール

他のextension同様、Marketplaceからインストールできる。

f:id:kamatimaru:20201227081812p:plain

有効化

試してみたところ、インストールしただけではPylanceは有効にならないようだった。

VS Codeの設定の「Python: Language Server」という項目が「Microsoft」になっているので、これを「Pylance」に変更する必要がある。

【変更前】
f:id:kamatimaru:20201228020233p:plain

【変更後】
f:id:kamatimaru:20201228020428p:plain

→ 設定を変更すると右下に「Reload」というポップアップが表示されるので、リロードする。

検証の前提

以下の環境で検証する。

  • フォーマッターやliterが入っていると、Pylanceの機能なのか分からなくなってしまうので、blackやisortやflake8はインストールしていない環境で検証する。
  • docstringに関しては、普段は「Python Docstring Generator」というPluginを使っているが、こちらも同様の理由で無効にする。

検証する

公式ドキュメントに紹介されている機能の中から、気になるものを検証していくことにする。

1.docstring

「docstring」としか書いてなかったので、最初はdocstringの雛形を自動生成してくれる機能がPylanceには標準で搭載されたのかと思った。
しかし、以下のissueを読んだところ、そうではなく、メソッドやクラスを使用している箇所でカーソルを合わせるとdocstringが吹き出しで表示される機能のことのようである。

github.com

【検証結果】
f:id:kamatimaru:20201228022633p:plain

上記のように、確かにメソッドのdocstringが表示された。

これはこれで地味だが嬉しい機能だと思う。
ただ、「Python Docstring Generator」は依然として必要ということが分かった。

2.Auto-imports

既にimportしているモジュールに関して、同一モジュール配下の新たなクラスやメソッドを使おうとすると、自動でサジェストを表示してくれて、サジェストを承認するとさらにimport文の追加まで自動で行ってくれる。

例えば、以下のように既にos.path.existsをimport済みであるとする。

f:id:kamatimaru:20201228030637p:plain

この時に、「j」と入力すると、joinメソッドがサジェストされる。

f:id:kamatimaru:20201228030911p:plain

サジェストを承諾すると、os.path.joinがimportに自動で追加される。

f:id:kamatimaru:20201228031240p:plain

「Auto-imports 」機能に関しては以下のブログでもデモを見ることができる。
devblogs.microsoft.com

3.IntelliCode compatibility

AIがコードを自動補完してくれる機能である。

code.visualstudio.com

これがすごく便利だった。

以前から存在していたようだが、Microsoftの標準のLanguage Serverを使用していた時には有効になっていなかった気がする。
以下のような記事もあったので互換性に問題があったのかもしれない。

qiita.com

PylanceではFeaturesの一つに

IntelliCode compatibility

と謳っている通り、問題なく使うことができた。

例えば、以下のように「os.」と入力すると一般的に利用頻度が高そうな「environ」と「path」をサジェストしてくれる。

f:id:kamatimaru:20201228033250p:plain

「path」を選択すると、さらに利用頻度が高そうな「join」と「dirname」メソッドをサジェストしてくれる。

f:id:kamatimaru:20201228033535p:plain

さらにすごいのが、もし以下のようにif文の条件の中で「os.path.」と入力すると「exists」と「isfile」をサジェストしてくれる。

f:id:kamatimaru:20201228033747p:plain

このように、コードの文脈によって適切なコードをサジェストしてくれるのは本当にすごいと思った。

なお、IntelliCodeが有効になっていない場合、サジェストは表示されるが、以下のようにモジュールがアルファベット順に表示されるだけになってしまうので、便利さが大分違う。

f:id:kamatimaru:20201228034537p:plain

その他のTips

メソッドの丸括弧部分の補完を有効にする。

以下のように、デフォルトではサジェストに基づいてメソッドを選択した際に、丸括弧が補完されないのが少し不便に感じた。

f:id:kamatimaru:20201228040455p:plain

これはpython.analysis.completeFunctionParensという設定値がデフォルトでは無効になっていることが原因である。
有効にすれば、丸括弧部分まで補完されるようになるので、私は有効にした。
f:id:kamatimaru:20201228040848p:plain

なお、以下の公式ドキュメントに編集可能な設定値については一覧が記載されている。
marketplace.visualstudio.com

感想

まだ数ある機能のいくつかを試しただけだが、良さげだったこと及び、公式のブログにも以下のように書かれており、MSもじょじょにPylanceに寄せていく方針のようなので、今後は仕事でも使ってみようかなと思った。

Our long-term plan is to transition our Microsoft Python Language Server users over to Pylance and eventually deprecate and remove the old language server as a supported option.

【引用元】
devblogs.microsoft.com