Возможно, вам стоит использовать
Pydantic вместо dataclasses для этого: он позволяет создавать
пользовательские валидаторы как отдельного поля, так и всех полей. Валидаторы можно использовать для преобразования типов данных. Что важно, он позволяет создавать пре-валидаторы, то есть те, которые будут применяться к полю перед стандартными валидаторами Pydantic. Например, вашу задачу можно решить так:
from datetime import date, datetime
from pydantic import BaseModel, validator
class Person(BaseModel):
first_name: str
last_name: str
bdate: date
@validator('bdate', pre=True)
def bdate_from_string(cls, v):
if isinstance(v, str):
return datetime.strptime(v, '%Y%m%d').date()
return v
data = {
'first_name': 'Adam',
'last_name': 'Smith',
'bdate': '20220617'
}
person = Person(**data)
print(person)
Если вы не хотите использовать Pydantic, то можно посмотреть на продвинутую альтернативу dataclasses —
attrs, может быть, там есть средства для решения вашей задачи.