Pydantic модель вычисляет свойство только один раз

#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