1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

typingを用いたdefaultdictの制限

Posted at

はじめに

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())
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?