gpt4 book ai didi

python - 如何在继承的数据类中创建可选字段?

转载 作者:行者123 更新时间:2023-12-03 15:08:58 27 4
gpt4 key购买 nike

from typing import Optional

@dataclass
class Event:
id: str
created_at: datetime
updated_at: Optional[datetime]
#updated_at: datetime = field(default_factory=datetime.now) CASE 1
#updated_at: Optional[datetime] = None CASE 2

@dataclass
class NamedEvent(Event):
name: str


创建事件实例时,我通常不会有 updated_at field 。我可以通过 current time作为默认值或在数据库中插入时为其添加一个值,并在对象的后续使用中获取它。哪种方法更好?
根据我的理解,我无法创建 NamedEvent没有在 case1 和 case2 中传递 updated_at 字段的实例,因为我在 name 字段中没有默认值。

最佳答案

您遇到的潜在问题似乎与 here 所描述的相同.该帖子的简短版本是,在函数签名(包括数据类生成的 __init__ 方法)中,强制参数(如 NamedEvent 的 name )不能跟在具有默认值的参数之后(这是定义行为所必需的)事件的 updated_at ) - 子字段将始终跟在其父字段之后。

因此,要么您的父类中没有默认值(在这种情况下不起作用),要么您 child 的所有字段都需要默认值(这很烦人,有时根本不可行)。

我上面链接的帖子讨论了一些可以用来解决问题的模式,但作为更好的选择,您也可以使用第三方包 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')

关于python - 如何在继承的数据类中创建可选字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61522624/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com