Pydantic 模型只计算 属性 一次
Pydantic model calculate property only once
我有一个计算值昂贵的模型。我需要在几个地方调用结果,这就是为什么在第一次调用时我想计算这个值然后 return 假设其他值不变的计算值。
我自己的解决方案是在第一次调用 属性 方法时设置一个内部属性:
from pydantic import BaseModel
class MyModel(BaseModel):
value1: int
_value2: int
@property
def value2(self):
if not hasattr(self, '_value2'):
print('calculated result')
self._value2 = self.value1*3
return self._value2
这适用于常规 class,但对于 pydantic 模型则失败:
>> mm = MyModel(value1=2)
>> mm.value2
calculated result
ValueError: "MyModel" object has no field "_value2"
将 underscore_attrs_are_private
设置为 True
解决了错误。还禁用对象上的突变涵盖上述假设。
from pydantic import BaseModel
class MyModel(BaseModel):
value1: int
_value2: int
class Config:
allow_mutation = False
underscore_attrs_are_private = True
extra = "forbid"
strict = True
validate_assignment = True
@property
def value2(self):
print('calculated result')
self._value2 = self.value1*3
return self._value2
我有一个计算值昂贵的模型。我需要在几个地方调用结果,这就是为什么在第一次调用时我想计算这个值然后 return 假设其他值不变的计算值。
我自己的解决方案是在第一次调用 属性 方法时设置一个内部属性:
from pydantic import BaseModel
class MyModel(BaseModel):
value1: int
_value2: int
@property
def value2(self):
if not hasattr(self, '_value2'):
print('calculated result')
self._value2 = self.value1*3
return self._value2
这适用于常规 class,但对于 pydantic 模型则失败:
>> mm = MyModel(value1=2)
>> mm.value2
calculated result
ValueError: "MyModel" object has no field "_value2"
将 underscore_attrs_are_private
设置为 True
解决了错误。还禁用对象上的突变涵盖上述假设。
from pydantic import BaseModel
class MyModel(BaseModel):
value1: int
_value2: int
class Config:
allow_mutation = False
underscore_attrs_are_private = True
extra = "forbid"
strict = True
validate_assignment = True
@property
def value2(self):
print('calculated result')
self._value2 = self.value1*3
return self._value2