シンプルなdataclasses.dataclass
はアトリビュートの型が定義と異なってもインスタンス化が可能。つまり以下のような例が実行可能。
@dataclasses.dataclass
class NormalDataclass:
foo: int
NormalDataclass(foo=1.1) # ok
厳密に型をチェックしたい場合は__post_init__
を定義すれば良い。__init__
の後に呼ばれるのでここで型チェックをしてみよう。
@dataclasses.dataclass
class StrictDataclass:
def __post_init__(self):
for key, val in self.__dataclass_fields__.items():
member = getattr(self, key)
assert isinstance(member, val.type), f"Invalid Type of member: {type(member)} != {val.type}"
foo: int
StrictDataclass(foo=1) # ok
StrictDataclass(foo=1.2) # AsertionError: Invalid Type of member: <class 'float'> != <class 'int'>
不正な値が入ってきた場合にいち早くassertionを投げてくれるのでデバックがしやすくなるかもしれない。