Ускоренный эффективный сбор данных из модели PydanticPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ускоренный эффективный сбор данных из модели Pydantic

Сообщение Anonymous »

Я использую Python 3.11 и pydantic 2.7. Я хочу собрать конкретную информацию из моей модели, а сама модель очень большая. Могу ли я собирать данные при анализе/проверке модели?
Я пытался использовать валидатор и переменную класса, но если вы попытаетесь сделать это несколько раз, сбор данных продолжится. Мне нужно, чтобы это было, например. Есть советы?
Мой код с проверкой скорости:

Код: Выделить всё

import copy
from time import perf_counter as time
from typing import Any, ClassVar

from pydantic import BaseModel, field_validator

class Employees(BaseModel):
name: str
employees_names: ClassVar[list[str]] = []

@field_validator('name')
@classmethod
def collect_employees_names(cls, value):
cls.employees_names.append(value)

return value

class EmployeesNative(BaseModel):
name: str

class Manager(BaseModel):
name: str
employees: list[Employees]
managers_names: ClassVar[list[str]] = []

@field_validator('name')
@classmethod
def collect_managers_names(cls, value):
cls.managers_names.append(value)

return value

class ManagerNative(BaseModel):
name: str
employees: list[EmployeesNative]

class Results(BaseModel):
managers: list[Manager]

class ResultsNative(BaseModel):
managers: list[ManagerNative]

class Data(BaseModel):
results: list[Results]

class DataNative(BaseModel):
results: list[ResultsNative]

class Schema(BaseModel):
data: Data

class SchemaNative(BaseModel):
data: DataNative

man1 = {'name': 'max', 'employees': [{'name': 'Jorge'}, {'name': 'Sasha'}]}
man2 = {'name': 'kate', 'employees': [{'name': 'Eva'}, {'name': 'Mike'}, {'name': 'Riss'}]}
man3 = {'name': 'bub', 'employees': []}
man4 = {'name': 'slava', 'employees': [{'name': 'Martha'}]}

res1 = {'managers': [man1]}
res2 = {'managers': [man2, man3]}
res3 = {'managers': [man4]}

def parse_native(obj: dict[str, Any]) -> list[str]:
""" Get all persons names in schema. """
mod = SchemaNative.model_validate(obj)

m = [m.name for res in mod.data.results for m in res.managers]
e = [e.name for res in mod.data.results for m in res.managers for e in m.employees]
r = m + e
print('native: ', r)

return r

def parse_validators(obj: dict[str, Any]) -> list[str]:
""" Get all persons names in schema. """
Schema.model_validate(obj)
r = Manager.managers_names + Employees.employees_names
print('validators: ', r)

return r

def run_test(func, objs, comment='', reps=1, average=True, prec=.6):
""" Speed checker. """
total = 0
for _ in range(reps):
for e in objs:
beg = time()
func(e)
end = time()
total += (end - beg)
t = total / reps if average else total
print(f'{t:{prec}f} ({comment})')

# payload for tests
test_obj = {'data': {'results': [res1, res2, res3]}}
payload = tuple(copy.deepcopy(test_obj) for _ in range(1))

# number of repetitions
REPS = 1

run_test(func=parse_native, objs=payload, comment='No validators', reps=REPS)

run_test(func=parse_validators, objs=payload, comment='With validators', reps=REPS)

Я безуспешно пытался установить переменные экземпляра во вложенных моделях и переопределить метод .model_validate()


Подробнее здесь: https://stackoverflow.com/questions/783 ... ntic-model
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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