Python
python3
VSCode

Pyreを使ってみた

pythonの型チェッカとしてはMypyが有名だと思います。私は普段Mypyを使っていますが、Facebookの開発したPyreというのがあることを知ったので使ってみました。

この記事では「FacebookはなぜPyreを開発したのか」とか「MypyとPyreの特徴比較」とかの話はしません。あくまで自分が使ってみた所感をまとめるだけです。

インストール

公式サイトにあるとおり、python>=3.5でpip install pyre-checkとするだけです。

いきなりVSCode拡張をインストール(おすすめしません)

これまた公式サイトの手順に従えば、チェックに引っかかったところをVSCodeで表示することができます。
pyre initとするとソースのディレクトリを聞かれるので指定します。あとは普通のVSCode拡張と同じで、インストールして再読込します。
おそらくおびただしい数のエラーが出るでしょう。これがおすすめしない理由です。

エラー潰し

エラー潰しはターミナルを使ってやるのが良いと思います。pyre checkしてエラーを眺めると、多くのサードパーティモジュールのインポートでエラーになっているのではないでしょうか。
これはPyreがモジュールを読みに行かないからで、コマンドラインオプション--search-pathでモジュール検索パスを渡せるので渡したくなるところですが、それをこらえて、スタブで対応するのが良いでしょう。
スタブはここで触れられてますが、Cでいうヘッダファイルという感じです。これをインポートエラーになっているすべてのモジュールに対して作ります……などというと大変そうですが心配は要りません。
pyiファイルによるスタブは別にPyreのためにできたものではなく、pythonの型ヒント機能そのもののためにあるものなので(こちらの記事がわかりやすいです)、生成ツールがまさにMypyにあります。
Mypyがインストールしてあればstubgen <モジュール名>で生成できるので、ソースディレクトリに置けばインポートエラーは解決するはずです。

その後

おそらくスタブをそのまま使うだけでは、"undefined name"的なエラーが出ると思うので、スタブを編集して潰していきます。
そうやって準備を整えればその効果がわかる……と思うのですが、私の環境/パッケージでは2つの問題が解決できず実用に堪えませんでした。

相対インポートが解決されない

issue起票しようかとも思ったのですが、facebookのプロジェクトでそんなトリビアルでない問題が対応されていないとは思えず、私のコードがおかしいのだろうと思っています。

ちなみに以下のような感じで再現できます。

コマンド
$ mkdir pyretest
$ touch pyretest/__init__.py
$ touch pyretest/foo.py
$ echo 'from . import foo' > pyretest/bar.py
$ pyre --source-directory pyretest check
出力
pyretest/bar.py:1:0 Undefined import [21]: Could not find a module corresponding to import `.`.

(2018/07/18追記) issueが起票されました。 https://github.com/facebook/pyre-check/issues/76

(2018/07/22追記) v0.10.0で解消されました!

Request textDocument/hover failed.なるエラーが抑制できない

これはVSCode拡張での話ですが、コードにカーソルを合わせてポップアップが出るたびに、Pyreの出力窓にRequest textDocument/hover failed.なるエラーが表示されます。Pyreでエラーになっている箇所以外でもです。
ただエラーになるのならいいのですが、エラーになるたびにPyre出力窓がアクティブになり、その頻度と相まって大変鬱陶しい。

issue起票しようかとも思ったのですが(ry

今後

まだまだ気になるプロダクトではあるので、チェックはしていきたいと思います。