Подсказка типа атрибутов класса данных никогда не выполняется в том смысле, что типы принудительно применяются или проверяются.Ожидается, что в основном статические проверки типа, такие как mypy , будут выполнять эту работу, Python не будет делать это во время выполнения, как никогда.
Если вы хотите добавить код проверки типа вручную, выполнитепоэтому в методе __post_init__
:
@dataclasses.dataclass
class Test:
value: int
def __post_init__(self):
if not isinstance(self.value, int):
raise ValueError('value not an int')
# or self.value = int(self.value)
Вы можете использовать dataclasses.fields(self)
, чтобы получить кортеж из Field
объектовкоторые определяют поле, тип и цикл, чтобы сделать это для каждого поля автоматически, без записи его для каждого отдельно.
def __post_init__(self):
for field in dataclasses.fields(self):
value = getattr(self, field.name)
if not isinstance(value, field.type):
raise ValueError(f'Expected {field.name} to be {field.type}, '
f'got {repr(value)}')
# or setattr(self, field.name, field.type(value))