Python 3.7 не за dataclass
, и я хотел протестировать некоторые новые интересные функции dataclass
+typing. Получить подсказки для правильной работы достаточно просто, как с родными типами, так и с типами из модуля typing
:
>>> import dataclasses
>>> import typing as ty
>>>
... @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
>>> my_struct = Structure(a_str='test', a_str_list=['t', 'e', 's', 't'])
>>> my_struct.a_str_list[0]. # IDE suggests all the string methods :)
Но еще одна вещь, которую я хотел попробовать, заключалась в том, чтобы принудительно указывать подсказки типов в качестве условий во время выполнения, то есть не должно быть возможности существования dataclass
с неправильными типами. Это может быть реализовано с помощью __post_init__
:
>>> @dataclasses.dataclass
... class Structure:
... a_str: str
... a_str_list: ty.List[str]
...
... def validate(self):
... ret = True
... for field_name, field_def in self.__dataclass_fields__.items():
... actual_type = type(getattr(self, field_name))
... if actual_type != field_def.type:
... print(f"\t{field_name}: '{actual_type}' instead of '{field_def.type}'")
... ret = False
... return ret
...
... def __post_init__(self):
... if not self.validate():
... raise ValueError('Wrong types')
Этот вид функции validate
работает для собственных типов и пользовательских классов, но не для тех, которые указаны модулем typing
:
>>> my_struct = Structure(a_str='test', a_str_list=['t', 'e', 's', 't'])
Traceback (most recent call last):
a_str_list: '<class 'list'>' instead of 'typing.List[str]'
ValueError: Wrong types
Есть ли лучший подход для проверки нетипизированного списка с typing
-typed? Предпочтительно тот, который не включает проверку типов всех элементов в любом list
, dict
, tuple
или set
который является атрибутом dataclass
.