Как я могу лениво вычислять некоторые свойства во время выполнения каждый раз, когда модель/поле обновляется?Python

Программы на Python
Anonymous
Как я могу лениво вычислять некоторые свойства во время выполнения каждый раз, когда модель/поле обновляется?

Сообщение Anonymous »

Я изучаю pydantic и хочу понять взаимодействие между классами Python и их свойствами с моделями pydantic.
В частности, я хочу определить некоторые вычисляемые переменные экземпляра лениво во время выполнения после создания модели и каждый раз при обновлении модели или определенного поля. Вот небольшой фрагмент игрового кода.
Вопрос: как я могу запрограммировать это каждый раз, когда я меняю дату рождения или возраст (при условии, что последний можно вычислить по заданному значению), а затем переоценить is_adult?
Могу ли я добиться этого с помощью только декоратора @properties Python и @computed_field Pyndatic или мне придется использовать @model_validator< /code> декоратор Pyndatic, чтобы получить такое поведение ловушки?
from typing import Optional
from pydantic import BaseModel, model_validator, field_validator, computed_field
from datetime import datetime

class Person(BaseModel):
name: Optional[str]
birthdate: Optional[datetime]
_children_names: list[str] = []

@computed_field
@property
def children_names(self) -> list[str]:
return self._children_names

@children_names.setter
def children_names(self, values: list[str]):
self._children_names += values

@computed_field
@property
def is_adult(self) -> bool:
return self.age >= 18

@model_validator(mode="after")
def compute_age(cls, values):
birthdate = values.birthdate
values.age = datetime.today().year - birthdate.year
return values

if __name__ == "__main__":
person = {
"name": "Luca",
"birthdate": "1993-01-30",
}
p = Person.model_validate(person)


Подробнее здесь: https://stackoverflow.com/questions/787 ... a-field-is

Вернуться в «Python»