创建一个设置后不可变的字段

KOB*_*KOB 5 python immutability pydantic

是否可以创建一个没有默认值的 Pydantic 字段,并且该值必须在对象实例创建时设置并且从那时起就不可变?

例如

from pydantic import BaseModel

class User(BaseModel):
    user_id: int
    name: str

user = User(user_id=1, name='John')
user.user_id = 2 # raises immutable error
Run Code Online (Sandbox Code Playgroud)

ale*_*ame 11

Pydantic 已经有您想要的选项。您可以通过指定为 false 来自定义特定字段allow_mutationTypeError如果在实例上分配了该字段,则会引发。

from pydantic import BaseModel, Field


class User(BaseModel):
    user_id: int = Field(..., allow_mutation=False)
    name: str

    class Config:
        validate_assignment = True


user = User(user_id=1, name='John')
user.user_id = 2  # TypeError: "user_id" has allow_mutation set to False and cannot be assigned
Run Code Online (Sandbox Code Playgroud)