如何给 Pydantic 列表字段一个默认值?

How to give a Pydantic list field a default value?

我想创建一个 Pydantic 模型,其中有一个未初始化的列表字段,默认值为空列表。有惯用的方法吗?

对于 Python 的内置数据类对象,您可以使用 field(default_factory=list),但是在我自己的实验中,这似乎可以防止我的 Pydantic 模型被 pickle。一个天真的实现可能是这样的:

from pydantic import BaseModel

class Foo(BaseModel):
    defaulted_list_field: Sequence[str] = [] # Bad!

但我们都知道不能使用像空列表文字这样的可变值作为默认值。

那么给 Pydantic 列表字段一个默认值的正确方法是什么?

对于 pydantic 你可以使用可变的默认值,比如:

class Foo(BaseModel):
    defaulted_list_field: List[str] = []

f1, f2 = Foo(), Foo()
f1.defaulted_list_field.append("hey!")

print(f1) # defaulted_list_field=['hey!']
print(f2) # defaulted_list_field=[]

它会被正确处理(深拷贝),每个模型实例都会有自己的空列表。


Pydantic 也有 default_factory parameter。在空列表的情况下,结果将是相同的,当 声明具有默认值的字段时使用它,您可能希望它是动态的(即每个模型不同).

from typing import List
from pydantic import BaseModel, Field
from uuid import UUID, uuid4

class Foo(BaseModel):
    defaulted_list_field: List[str] = Field(default_factory=list)
    uid: UUID = Field(default_factory=uuid4)