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

问题描述 投票:0回答:3

是否可以创建一个没有默认值的 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
python immutability pydantic
3个回答
8
投票

Pydantic 已经有您想要的选项。您可以通过将 allow_mautation 指定为 false 来

自定义
特定字段。如果在实例上分配了该字段,则会引发
TypeError

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

3
投票

您可以尝试下面我的解决方案:

from pydantic import BaseModel, Field
class User(BaseModel):
    user_id: int
    name: str
    def setattr(cls, name, value):
        if name == "user_id": # or add more fiels here
            raise AttributeError("Cannot modify {}".format(name))
        else:
            return type.setattr(cls, name, value)

user = User(user_id=1, name='John')
user.user_id = 2 # raises immutable error

1
投票

如果你想让所有字段不可变,你可以将类声明为冻结

class User(BaseModel):
    user_id: int
    name: str
    class Config:
        frozen = True

但是,这将使所有字段不可变,而不仅仅是特定字段

© www.soinside.com 2019 - 2024. All rights reserved.