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作为默认值传递,也可以在数据库中进行插入时向其添加一个值,并在后续使用对象时获取它.哪种方式更好?

推荐答案

你面临的潜在问题似乎与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')

Python-3.x相关问答推荐

Django 模型类方法使用错误的 `self`

Select 作为 MultiIndex 一部分的两个 DatetimeIndex 之间的行

如何创建与导航抽屉一起使用的导航栏

Pandas 转换为日期时间

按字母顺序排序列表 (OrderFilter),条件是值为 '' 的条目位于列表 DRF 的末尾

使用 Python 截断并重新编号对应于特定 ID/组的列

裁剪复数以解决 exp 中的溢出错误

删除Pandas 数据框行不起作用

Python ** 用于负数

集合操作:应该只适用于集合,但适用于 dict_keys?

python tkInter 浏览文件夹按钮

将变量传递给 Google Cloud 函数

多个返回函数的列表理解?

Python:pprint的模块错误,打印没有错误

如何将 cv2.imread 匹配到 keras image.img_load 输出

try 在 Windows 10 高 DPI 显示器上解决模糊的 tkinter 文本 + zoom ,但担心我的方法不是 Pythonic 或不安全

Pyodbc:登录超时错误

每次启动 Google Colab 时都必须安装所需的软件包吗?

如何为 Python 3.x 安装 psycopg2?

在 Keras 中训练神经网络的零精度