Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

自動的に Annotation を追加してくれる pyannotate が便利そう

TL; DR

こいつを使うと、Annotation を追加していない部分に自動的に適用してくれます。

github.com

もう少し詳しく

詳しい使い方はリポジトリを見ていただくとして、要はこの実装に対して実行すると、

gist.github.com

こういう風になります。

gist.github.com

残念ながらこのエントリを書いている本日現在では python3 形式での変換には対応していないようですが、README の TODO に Python 3 code generation.  と書いてあるのでそのうち対応されるんではないでしょうか。
ちなみに手動で書き換えるとこういう風になるんだと思います。

gist.github.com

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 を使用してみています。

github.com

雑感

このライブラリから得られた結果をそのままで使うというよりもあくまで参考にする程度の気持ちでいたほうが良さそう。
上に例示した内容の場合もそうですが、たとえばネストされた dict だと Dict[str, Any] になりがちです。しかしながら実際の実装では本当は構造がちゃんと決まっているかもしれないので、その場合は適切に書き換えてあげる必要があるでしょう。極力 Any は使いたくない。
また、これも例示した内容に含まれていますが、requests のようなサードパーティライブラリであっても適切にどのクラスのオブジェクトインスタンスなのかということを判断して import も自動的に挿入してくれるのはとても便利ですね。
なんにしても、Python で type hinting を始めてみようという段階ではとんでもなく便利だと思います。