Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在继承的数据类中创建可选字段? 从输入导入可选 @数据类 班级活动: id:str 创建时间:datetime 更新时间:可选[日期时间] #更新时间:datetime=field(默认工厂=datetime.now)案例1 #更新时间:可选[日期时间]=无情况2 @数据类 类名devent(事件): 姓名:str_Python_Python 3.x_Python Dataclasses - Fatal编程技术网

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')