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