你面临的潜在问题似乎与here年前描述的问题相同.这篇文章的简短版本是,在函数签名(包括dataclass生成的__init__
方法)中,强制参数(如NamedEvent的name
)不能跟在带有默认值的参数之后(这是定义事件updated_at
行为所必需的)——子级字段将始终跟在其父级字段之后.
因此,要么父类中没有默认值(在本例中不起作用),要么子类的所有字段都需要默认值(这很烦人,有时根本不可行).
我上面链接的帖子讨论了一些可以用来解决问题的模式,但作为更好的 Select ,你也可以使用第三方软件包pydantic
,它已经为你解决了这个问题.示例实现可能如下所示:
import pydantic
from datetime import datetime
class Event(pydantic.BaseModel):
id: str
created_at: datetime = None
updated_at: datetime = None
@pydantic.validator('created_at', pre=True, always=True)
def default_created(cls, v):
return v or datetime.now()
@pydantic.validator('updated_at', pre=True, always=True)
def default_modified(cls, v, values):
return v or values['created_at']
class NamedEvent(Event):
name: str
通过验证器的默认值规范有点麻烦,但总的来说,它是一个非常有用的包,可以修复在使用数据类时遇到的许多缺点,以及其他一些缺点.
使用类定义,可以创建NamedEvent
的实例,如下所示:
>>> NamedEvent(id='1', name='foo')
NamedEvent(id='1', created_at=datetime.datetime(2020, 5, 2, 18, 50, 12, 902732), updated_at=datetime.datetime(2020, 5, 2, 18, 50, 12, 902732), name='foo')