自動的に Annotation を追加してくれる pyannotate が便利そう
TL; DR
こいつを使うと、Annotation を追加していない部分に自動的に適用してくれます。
もう少し詳しく
詳しい使い方はリポジトリを見ていただくとして、要はこの実装に対して実行すると、
こういう風になります。
残念ながらこのエントリを書いている本日現在では python3 形式での変換には対応していないようですが、README の TODO に Python 3 code generation.
と書いてあるのでそのうち対応されるんではないでしょうか。
ちなみに手動で書き換えるとこういう風になるんだと思います。
pytest と組み合わせるとさらに便利
pyannotate
は実際に実行してみた結果を収集しながら型情報を適用するための JSON ファイルを生成してから、それをベースにして適用を行うという仕組みです。
pyannotate/example at master · dropbox/pyannotate · GitHub を覗いてみると、以下のような説明があり、pytest
で実際に走破された箇所に対しての JSON ファイルを生成するためのヘルパーを含んだ conftest.py
のサンプルがあります。
Alternative, using pytest For pytest users, the example_conftest.py file shows how to automatically configures pytest to collect types when running tests. The test_gcd.py file contains a simple test to demonstrate this. Copy the contents of example_conftest.py to your conftest.py file and run pytest; it will then generate a type_info.json file like the one above.
どうせテストは書くんだからこれはかなり便利なんじゃないでしょうか。
今回の例を出すために使用した実装は以下にアップしていますが、実際にその conftest.py
を使用してみています。
雑感
このライブラリから得られた結果をそのままで使うというよりもあくまで参考にする程度の気持ちでいたほうが良さそう。
上に例示した内容の場合もそうですが、たとえばネストされた dict
だと Dict[str, Any]
になりがちです。しかしながら実際の実装では本当は構造がちゃんと決まっているかもしれないので、その場合は適切に書き換えてあげる必要があるでしょう。極力 Any
は使いたくない。
また、これも例示した内容に含まれていますが、requests
のようなサードパーティライブラリであっても適切にどのクラスのオブジェクトインスタンスなのかということを判断して import
も自動的に挿入してくれるのはとても便利ですね。
なんにしても、Python で type hinting を始めてみようという段階ではとんでもなく便利だと思います。