【问题标题】:How to create an optional field in a dataclass that is inherited?如何在继承的数据类中创建可选字段?
【发布时间】:2020-08-14 18:29:50
【问题描述】:
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 字段。我可以将current time 作为默认值传递,也可以在插入数据库时​​为其添加一个值,并在对象的后续使用中获取它。哪个是更好的方法? 根据我的理解,我无法在不传递 case1 和 case2 中的 updated_at 字段的情况下创建 NamedEvent 实例,因为我在 name 字段中没有默认值。

【问题讨论】:

    标签: python python-3.x python-dataclasses


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多