情報系大学院生の勉強メモ

主に機械学習,Python

MonkeyTypeを使ってみた

今回は軽めの記事です。

MonkeyTypeとは

github.com

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_modulemonkeytype 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してくれています。すごい。