はじめに
typingを用いたdefaultdictの公式ドキュメントがあります.
しかし,使い方は詳しく説明されていないため,まとめようと思います.
defualtdict
defaultdictは,callable
,かつ値を返すものを指定します.
例えば以下のようなものです.
from collections import defaultdict
d1 = defaultdict(int)
d2 = defaultdict(lambda: 'hello')
int
はCallableのため,指定できます.
そして,もしKeyがなければ,これらのCallableが呼ばれて初期値となります.
よって,d1['hello']
とすると,この時点でKeyが存在しなければint()
が実行されて0が入ります.
typingを用いたdefaultdict
defaultdictは,Value側のCallableは指定できますが,Keyに関しては制限がありません.
そのため,Keyはstrのみしかとらない設計にする!とエンジニアが考えていたとしても,IDEにその思いはおそらく届きません.
そのため,typingを利用します.
from collections import defaultdict
from typing import DefaultDict
dic: DefaultDict[str, int] = defaultdict(int)
dic['hoge'] = 10
dic['huga']
# defaultdict(<class 'int'>, {'hoge': 10, 'huga': 0}
print(dic)
DefaultDict[key, value]
のように型を指定することで,keyの取る型, valueの取る型を制限できます.
そのため,以下のように書くとIDEから,int
の型をValueに取るはずなのにAのインスタンスが初期値に入ってしまうと注意されます.(型サポートを受けやすくなります,嬉しいですね.)
from collections import defaultdict
from typing import DefaultDict
class A:
pass
dic: DefaultDict[str, int] = defaultdict(lambda: A())