Quiero crear un modelo de Pydantic en el que haya un campo de lista, que dejado sin inicializar tiene un valor predeterminado de una lista vacía. ¿Hay una manera idiomática de hacer esto?
Para los objetos de clase de datos incorporados de Python, puede usar field(default_factory=list) , sin embargo, en mis propios experimentos, esto parece evitar que mis modelos de Pydantic se decapan. Una implementación ingenua podría ser, algo como esto:
from pydantic import BaseModel class Foo(BaseModel): defaulted_list_field: Sequence[str] = [] # Bad!Pero todos sabemos que no debemos usar un valor mutable como el literal de lista vacía como valor predeterminado.
Entonces, ¿cuál es la forma correcta de dar un valor predeterminado a un campo de lista de Pydantic?
Para pydantic puede usar un valor predeterminado mutable, como:
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=[]Se manejará correctamente (copia profunda) y cada instancia del modelo tendrá su propia lista vacía.
Pydantic también tiene el parámetro default_factory . En el caso de una lista vacía, el resultado será idéntico, se usa más bien cuando se declara un campo con un valor predeterminado, es posible que desee que sea dinámico (es decir, diferente para cada modelo) .
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)