Для чего используется Pydantic и какие типы данных он может валидировать

«Для чего используется Pydantic и какие типы данных он может валидировать» — вопрос из категории Библиотеки и модули, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Pydantic — это библиотека для валидации, парсинга и сериализации данных в Python, основанная на аннотациях типов. Она гарантирует, что данные соответствуют заданной структуре (модели).

Основное назначение:

  1. Валидация данных: Проверка типов, форматов (email, URL) и ограничений (например, min_length).
  2. Парсинг и приведение типов (coercion): Автоматическое преобразование входных данных в нужные типы Python (например, строки "123" в int).
  3. Сериализация: Преобразование моделей Pydantic в словари или JSON.
  4. Управление настройками: Загрузка конфигурации приложения из переменных окружения.

Поддерживаемые типы данных:

Pydantic работает с большинством стандартных типов Python:

  • Примитивные типы: int, float, str, bool, bytes.
  • Сложные типы: List, Dict, Tuple, Set, Enum.
  • Типы из стандартной библиотеки: datetime, date, UUID, Path.
  • Вложенные модели: Поля могут быть другими моделями Pydantic.
  • Опциональные типы: Optional[T] или Union[T, None].

Пример валидации и парсинга

from pydantic import BaseModel, ValidationError, Field
from typing import List

class User(BaseModel):
    id: int
    name: str = Field(..., min_length=2)
    tags: List[str] = []

# 1. Успешная валидация с приведением типов
# 'id' будет преобразован из строки в int
data_valid = {"id": "123", "name": "Alice", "tags": ["admin", "dev"]}
user = User(**data_valid)
print(user.model_dump_json(indent=2))
# Вывод:
# {
#   "id": 123,
#   "name": "Alice",
#   "tags": [
#     "admin",
#     "dev"
#   ]
# }

# 2. Ошибка валидации
data_invalid = {"id": "abc", "name": "B"} # id - не число, name - слишком короткое
try:
    User(**data_invalid)
except ValidationError as e:
    print(e)
# Вывод:
# 2 validation errors for User
# id
#   Input should be a valid integer, unable to parse string as an integer [type=int_parsing, ...]
# name
#   String should have at least 2 characters [type=string_too_short, ...]