PythonにはHashable,Unhashableという概念があり、辞書型の鍵にしようできるのはHashableなオブジェクトのみ。
割と便利なDataclassを使っていて辞書の鍵として使いたいときに、Hashableにする方法を調べたのでメモ。
データクラス内にHashableな値しかない場合
デコレーターのfrozen=True
をつけると、データクラス内の値がHashableになる。
from dataclasses import dataclass
@dataclass(frozen=True)
class Sample:
a: int
b: str
データクラス内にHashableでない値がある場合
対応する値をHashableにする。
下記例では、a
の値をfrozenset
にすることでHashableになる。
型変換の処理は__post_init__
で行うことで自動的に行われる。
from dataclasses import dataclass
@dataclass(frozen=True)
class Sample:
a: int
b: str
c: list | frozenset
def __post_init__(self):
object.__setattr__(self, "c", frozenset(self.c))