如何给 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)
我想创建一个 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)