🐍

pytype を使っている

2020/09/18に公開

とりあえず書いてみるかということで、内容は薄いですが。

Python の type hints が正しくついているかを検証してくれる analyzer はいくつか選択肢がありますが、私が本業でやっている開発プロジェクトでは、Google が公開している pytype を使っています。

https://github.com/google/pytype

以下のような感じで CI にも組み込んでいて、大変役に立っています。
https://github.com/slackapi/bolt-python/blob/v0.5.3a0/.travis.yml#L29

この analyzer は本当に賢くて、ピント外れの指摘をしてくることが少ないし、的確に type hints の間違いを指摘してくれるので、本当に助かっています。作っている人たちを心から尊敬します。

ちょっとしたハマりポイントをあげるとするなら、相対パスからの import の解釈で parse に失敗することがあります。かつ、この挙動はバージョンアップで変わったりするので、 都度 pytype のために import の方式を書き換えてあげる必要があるかもしれません。例えば、同じ階層にある __init__.py.foo にある Foo を import していることに依存して .Foo で import してて問題なかったコードを .foo.Foo に変えたりとか(逆だったかも)、そういうパターンがあります。あとは、どうしてもやむを得ないところは出てくるので、そういうときは # type: ignore をつけて無視させたりもしています。

実行時間についても一言。この Bolt もそうですが、そこそこの規模になっていると全部のスキャンをするのに、まぁまぁ時間がかかります。一応、.pytype というディレクトリにキャッシュを作って、可能な限り差分でチェックしようとはしてくれますが、いろんなところから呼ばれているコードをいじると、どうしてもフルスキャンになります。なので、私の場合は、ちょっといじったら実行というよりは、一通り変更し終えたら、スキャンするみたいな使い方をすることが多いです。

type hints をつけている Python プロジェクトなら試す価値があると思います。こういうものを導入せずに type hints のクオリティを維持するのは難しい(というかほぼ不可能)と思いますので。

Discussion