5.9 KiB
5.9 KiB
Интеграция схем Pydantic с парсерами
Обзор
Этот документ описывает решение для устранения дублирования логики между схемами Pydantic и парсерами. Теперь схемы Pydantic являются единым источником правды для определения параметров парсеров.
Проблема
Ранее в парсерах дублировалась информация о параметрах:
# В парсере
self.register_getter(
name="single_og",
method=self._get_single_og,
required_params=["id", "codes", "columns"], # Дублирование
optional_params=["search"], # Дублирование
description="Получение данных по одному ОГ"
)
# В схеме
class SvodkaPMSingleOGRequest(BaseModel):
id: OGID = Field(...) # Обязательное поле
codes: List[int] = Field(...) # Обязательное поле
columns: List[str] = Field(...) # Обязательное поле
search: Optional[str] = Field(None) # Необязательное поле
Решение
1. Утилиты для работы со схемами
Создан модуль core/schema_utils.py с функциями:
get_required_fields_from_schema()- извлекает обязательные поляget_optional_fields_from_schema()- извлекает необязательные поляregister_getter_from_schema()- регистрирует геттер с использованием схемыvalidate_params_with_schema()- валидирует параметры с помощью схемы
2. Обновленные парсеры
Теперь парсеры используют схемы как единый источник правды:
def _register_default_getters(self):
"""Регистрация геттеров по умолчанию"""
# Используем схемы Pydantic как единый источник правды
register_getter_from_schema(
parser_instance=self,
getter_name="single_og",
method=self._get_single_og,
schema_class=SvodkaPMSingleOGRequest,
description="Получение данных по одному ОГ"
)
3. Валидация параметров
Методы геттеров теперь автоматически валидируют параметры:
def _get_single_og(self, params: dict):
"""Получение данных по одному ОГ"""
# Валидируем параметры с помощью схемы Pydantic
validated_params = validate_params_with_schema(params, SvodkaPMSingleOGRequest)
og_id = validated_params["id"]
codes = validated_params["codes"]
columns = validated_params["columns"]
search = validated_params.get("search")
# ... остальная логика
Преимущества
- Единый источник правды - информация о параметрах хранится только в схемах Pydantic
- Автоматическая валидация - параметры автоматически валидируются с помощью Pydantic
- Синхронизация - изменения в схемах автоматически отражаются в парсерах
- Типобезопасность - использование типов Pydantic обеспечивает типобезопасность
- Документация - Swagger документация автоматически генерируется из схем
Совместимость
Решение работает с:
- Pydantic v1 (через
__fields__) - Pydantic v2 (через
model_fieldsиis_required())
Использование
Для новых парсеров
- Создайте схему Pydantic с нужными полями
- Используйте
register_getter_from_schema()для регистрации геттера - Используйте
validate_params_with_schema()в методах геттеров
Для существующих парсеров
- Убедитесь, что у вас есть соответствующая схема Pydantic
- Замените ручную регистрацию геттеров на
register_getter_from_schema() - Добавьте валидацию параметров в методы геттеров
Примеры
Схема с обязательными и необязательными полями
class ExampleRequest(BaseModel):
required_field: str = Field(..., description="Обязательное поле")
optional_field: Optional[str] = Field(None, description="Необязательное поле")
Регистрация геттера
register_getter_from_schema(
parser_instance=self,
getter_name="example_getter",
method=self._example_method,
schema_class=ExampleRequest,
description="Пример геттера"
)
Валидация в методе
def _example_method(self, params: dict):
validated_params = validate_params_with_schema(params, ExampleRequest)
# validated_params содержит валидированные данные
Заключение
Это решение устраняет дублирование кода и обеспечивает единообразие между API схемами и парсерами. Теперь изменения в схемах автоматически отражаются в парсерах, что упрощает поддержку и развитие системы.