Python 如何在继承的数据类中创建可选字段? 从输入导入可选 @数据类 班级活动: id:str 创建时间:datetime 更新时间:可选[日期时间] #更新时间:datetime=field(默认工厂=datetime.now)案例1 #更新时间:可选[日期时间]=无情况2 @数据类 类名devent(事件): 姓名:str
创建事件实例时,我通常不会在字段中更新Python 如何在继承的数据类中创建可选字段? 从输入导入可选 @数据类 班级活动: id:str 创建时间:datetime 更新时间:可选[日期时间] #更新时间:datetime=field(默认工厂=datetime.now)案例1 #更新时间:可选[日期时间]=无情况2 @数据类 类名devent(事件): 姓名:str,python,python-3.x,python-dataclasses,Python,Python 3.x,Python Dataclasses,创建事件实例时,我通常不会在字段中更新。我可以将当前时间作为默认值传递,也可以在数据库中进行插入时向其添加一个值,并在后续使用对象时获取该值。哪种方式更好? 根据我的理解,我不能创建一个NamedEvent实例而不在case1和case2中传递更新的_at字段,因为我在name字段中没有默认值 您遇到的潜在问题似乎与前面描述的问题相同。该帖子的简短版本是,在函数签名(包括生成的数据类\uuuu init\uuuu方法)中,强制参数(如NamedEvent的name)不能跟在带有默认值的参数之后(
。我可以将当前时间
作为默认值传递,也可以在数据库中进行插入时向其添加一个值,并在后续使用对象时获取该值。哪种方式更好?
根据我的理解,我不能创建一个NamedEvent
实例而不在case1和case2中传递更新的_at字段,因为我在name字段中没有默认值 您遇到的潜在问题似乎与前面描述的问题相同。该帖子的简短版本是,在函数签名(包括生成的数据类\uuuu init\uuuu
方法)中,强制参数(如NamedEvent的name
)不能跟在带有默认值的参数之后(这是定义事件在更新时的行为所必需的)-子项字段将始终紧跟在其父项字段之后
因此,要么父类中没有默认值(在本例中不起作用),要么子类的所有字段都需要默认值(这很烦人,有时根本不可行)
我上面链接的帖子讨论了一些可以应用于解决问题的模式,但是作为更好的选择,您也可以使用已经为您解决了这个问题的第三方软件包。示例实现可能如下所示:
导入pydantic
从日期时间导入日期时间
类事件(pydantic.BaseModel):
id:str
创建时间:datetime=None
更新时间:datetime=None
@pydantic.validator('created_at',pre=True,always=True)
已创建def默认值(cls,v):
返回v或datetime.now()
@验证器('updated_at',pre=True,always=True)
def default_已修改(cls、v、值):
返回v或值['created_at']
类名devent(事件):
姓名:str
通过验证器的默认值规范有点麻烦,但总的来说,它是一个非常有用的包,修复了您在使用数据类时遇到的许多缺点,以及其他一些缺点
使用类定义,可以如下方式创建NamedEvent
的实例:
NamedEvent(id='1',name='foo')
NamedEvent(id='1',创建时间=datetime.datetime(2020,5,2,18,50,12,902732),更新时间=datetime.datetime(2020,5,2,18,50,12,902732),name='foo')