You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Pydantic对象重置为默认值(保留引用)

Pydantic模型保留引用恢复默认值的最佳实践

当Pydantic对象存在外部引用时,不能通过重新实例化的方式重置(否则引用会指向新对象),直接修改原对象是最优解,下面是两种可靠的实现方式:

方法一:遍历字段手动重置

给模型添加一个reset方法,遍历所有字段并设置为默认值。这种方法适合简单模型,需要区分普通默认值和default_factory的情况:

from pydantic import BaseModel, Field, model_fields

class MyObject(BaseModel):
    value: int = Field(default=1)
    data: list = Field(default_factory=list)
    
    def reset(self):
        for field_name, field in model_fields.items():
            # 处理default_factory类型的字段
            if field.default_factory is not None:
                setattr(self, field_name, field.default_factory())
            else:
                setattr(self, field_name, field.default)

# 初始化带自定义值的对象
my_object = MyObject(value=2, data=[1,2,3])
# 保留引用
reference = [my_object]

# 执行重置
my_object.reset()

# 验证引用指向的对象已恢复默认
assert reference[0].value == 1
assert reference[0].data == []

方法二:通过默认实例复制属性

创建一个模型的默认实例,再将其属性逐一复制到原对象上。这种方法更通用,无需手动处理default_factory:

from pydantic import BaseModel, Field

class MyObject(BaseModel):
    value: int = Field(default=1)
    nested: dict = Field(default_factory=dict)
    
    def reset(self):
        # 创建默认实例
        default_obj = self.__class__()
        # 复制所有字段的默认值到当前对象
        for field in self.model_fields:
            setattr(self, field, getattr(default_obj, field))

my_object = MyObject(value=2, nested={"name": "test"})
reference = [my_object]

my_object.reset()

assert reference[0].value == 1
assert reference[0].nested == {}

注意事项

  • 原示例代码中的MyObject(value1=2)是笔误,正确参数名应为value,否则会抛出字段不存在的错误。
  • 对于包含不可变类型(如int、str)和可变类型(如list、dict)的字段,两种方法都能正确重置,第二种方法更省心。

内容的提问来源于stack exchange,提问作者pyjedy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 01:39:58