Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: Pydantic, data validation, custom validator, datetime parsing, Python

Как обрабатывать входящие данные с разными форматами (например даты) в Pydantic?

Этот вопрос проверяет умение использовать Pydantic для валидации и преобразования входящих данных с нестандартными форматами, что критически важно для создания надежных API и обработки пользовательского ввода.

Короткий ответ

Pydantic позволяет обрабатывать данные с разными форматами через кастомные валидаторы и тип `datetime`. Для дат можно использовать `@field_validator` с логикой парсинга нескольких форматов. Также можно определить собственный тип, наследуясь от `pydantic.CustomRootType`, или использовать `BeforeValidator` из `pydantic.functional_validators` для предварительного преобразования строки. Это обеспечивает гибкость и чистоту кода, отделяя логику валидации от бизнес-логики.

Длинный ответ

Pydantic — это библиотека для валидации данных и настроек в Python, которая широко используется в веб-фреймворках, таких как FastAPI, для обработки входящих запросов. Часто данные, особенно даты, могут поступать в различных строковых форматах (например, '2023-12-31', '31/12/2023', 'Dec 31, 2023'), и Pydantic предоставляет несколько механизмов для их корректного приведения к типу datetime.

Использование кастомных валидаторов

Самый распространенный способ — создание валидатора для конкретного поля с помощью декоратора @field_validator. Внутри валидатора можно попробовать распарсить строку, используя несколько возможных форматов.

from pydantic import BaseModel, field_validator
from datetime import datetime

class Event(BaseModel):
    name: str
    event_date: datetime

    @field_validator('event_date', mode='before')
    @classmethod
    def parse_date(cls, v):
        if isinstance(v, str):
            # Пробуем несколько форматов
            for fmt in ('%Y-%m-%d', '%d/%m/%Y', '%b %d, %Y'):
                try:
                    return datetime.strptime(v, fmt)
                except ValueError:
                    pass
            raise ValueError('Invalid date format')
        return v

# Использование
model = Event(name="Meeting", event_date="2023-12-31")
print(model.event_date)  # 2023-12-31 00:00:00

Создание пользовательского типа

Для повторного использования логики парсинга можно создать собственный тип данных, унаследовав его от datetime и определив метод __get_validators__.

from pydantic_core import core_schema
from pydantic import GetCoreSchemaHandler
from typing import Any

class FlexibleDate(datetime):
    @classmethod
    def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler):
        def validate(value):
            if isinstance(value, str):
                for fmt in ('%Y-%m-%d', '%d/%m/%Y'):
                    try:
                        return datetime.strptime(value, fmt)
                    except ValueError:
                        pass
                raise ValueError('Invalid date')
            return value
        return core_schema.no_info_plain_validator_function(validate)

class Event(BaseModel):
    date: FlexibleDate

Применение и вывод

Такой подход применяется при разработке API, где клиенты могут присылать данные в разных форматах, или при обработке файлов (CSV, JSON) из внешних источников. Это делает систему более устойчивой к изменениям и удобной для интеграции.

Итог: Используйте кастомные валидаторы Pydantic, когда нужно обрабатывать разноформатные данные, особенно даты, чтобы обеспечить чистоту и надежность валидации на границах системы, не загромождая бизнес-логику.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

  • FastAPI

    FastAPI

Ключевые слова

#Pydantic

#data validation

#custom validator

#datetime parsing

#Python

Подпишись на Python Developer в телеграм