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