MonkeyTypeを使ってみた
今回は軽めの記事です。
MonkeyTypeとは
Instagram社によって2017年に公開された型ヒントのスタブファイルと型アノテーションを自動生成するツールです。
python>=3.6
で使えるそうです。
インストールはpip install MonkeyType
でできます。
自動で型アノテーションできるならすごい便利そうってことで使ってみました。
Experiment
まずは公式にも載っている例で試してみます。
int_module.py
def add(a, b): return a + b
main.py
from int_module import add def main(): add(1,3) if __name__ == '__main__': main()
このようなコードを書き、
monkeytype run main.py
を実行します。
するとmain.py
が実行されてmonkeytype.sqlite3
ファイルのsqliteデータベースにtrace情報がdumpされます。
この状態でmonkeytype stub int_module
を実行すると
def add(a: int, b: int) -> int: ...
スタブが出力されます。
monkeytype apply int_module
を実行すると、int_module.py
が書き換わります。
def add(a: int,b: int) -> int: return a+b
このように書き換わっていました。ちゃんと型アノテーションがされています。
int型以外ではどうなるか気になったので別の型も試してみます。
list_module.py
def double_list(x): return x*2
pandas_module.py
import pandas as pd def convert_dict_to_df(table): return pd.DataFrame(table)
引数にList型を取る関数と引数としてDict型を取りpandasのDataFrameとして返す関数も試してみます。
実行するmain.py
from int_module import add,mul from list_module import double_list from pandas_module import convert_dict_to_df def main(): add(1,3) double_list([1,2,3]) d={'key1': [1,2,3], 'key2': [4,5,6], 'key3': [7,8,9]} convert_dict_to_df(d) return if __name__ == '__main__': main()
monkeytype run main.py
を実行した後,
monkeytype apply list_module
と
monkeytype apply pandas_module
を実行すると
list_module.py
from typing import List def double_list(x: List[int]) -> List[int]: return x*2
pandas_module.py
import pandas as pd from pandas.core.frame import DataFrame from typing import Dict, List def convert_dict_to_df(table: Dict[str, List[int]]) -> DataFrame: return pd.DataFrame(table)
このようにアノテーションしてくれました。
from pandas.core.frame import DataFrame
のようにちゃんと外部モジュールから相当する型を勝手にimportしてくれています。すごい。