创建一个设置后不可变的字段
Create a field which is immutable after being set
是否可以创建一个没有默认值的 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
如果要使所有字段不可变,可以将 class 声明为已冻结
class User(BaseModel):
user_id: int
name: str
class Config:
frozen = True
但是,这将使所有字段不可变,而不仅仅是特定字段
您可以尝试下面我的解决方案:
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
Pydantic 已有您想要的选项。您可以通过将 allow_mautation
指定为 false 来 customize 特定字段。如果在实例上分配了该字段,则会引发 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
是否可以创建一个没有默认值的 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
如果要使所有字段不可变,可以将 class 声明为已冻结
class User(BaseModel):
user_id: int
name: str
class Config:
frozen = True
但是,这将使所有字段不可变,而不仅仅是特定字段
您可以尝试下面我的解决方案:
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
Pydantic 已有您想要的选项。您可以通过将 allow_mautation
指定为 false 来 customize 特定字段。如果在实例上分配了该字段,则会引发 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