#python #pydantic
Вопрос:
У меня есть модель с расчетным значением, которое дорого рассчитать. Мне нужно вызвать результаты в нескольких местах, поэтому при первом вызове я хочу вычислить это значение, а затем вернуть вычисленное значение, предполагая, что другие значения не изменятся.
Мое собственное решение состоит в том, чтобы иметь внутренний атрибут, который устанавливается при первом вызове метода свойства:
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
Это сработало бы с обычным классом, но с моделью pydantic это не удается:
>> mm = MyModel(value1=2)
>> mm.value2
calculated result
ValueError: "MyModel" object has no field "_value2"
Ответ №1:
Установка 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