Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Введение в Pydantic: зачем и почему
introduction_pydantic

Введение в Pydantic: зачем и почему

Что такое Pydantic, зачем он нужен, установка и первый запуск. Базовая модель и валидация по умолчанию.

Введение в Pydantic: зачем и почему

Pydantic — это не просто валидация, это язык описания данных в современном Python

#Почему Pydantic?

Представьте, что вы пишете API для регистрации пользователей. Вам приходит JSON:

{ "name": "Alice", "age": 25, "email": "alice@example.com" }

Без Pydantic вам придётся писать код вроде этого:

def validate_user(data: dict) -> dict: # Проверка типа name if not isinstance(data.get('name'), str): raise ValueError('name must be a string') if len(data['name']) < 2: raise ValueError('name must be at least 2 characters') # Проверка типа age if not isinstance(data.get('age'), int): raise ValueError('age must be an integer') if data['age'] < 0 or data['age'] > 150: raise ValueError('age must be between 0 and 150') # Проверка email if '@' not in data.get('email', ''): raise ValueError('invalid email') return data

Это многословно, подвержено ошибкам и не масштабируется. С Pydantic:

from pydantic import BaseModel, EmailStr, Field class User(BaseModel): name: str = Field(min_length=2) age: int = Field(ge=0, le=150) email: EmailStr user = User(name="Alice", age=25, email="alice@example.com")

Pydantic автоматически:

  • Проверит типы данных
  • Применит ограничения из Field
  • Преобразует данные (например, строку "25" в число 25)
  • Выбросит понятное исключение при ошибке

#Установка

pip install pydantic # или для продвинутой валидации email: pip install pydantic[email]

Для этого курса требуется Pydantic v2.5+. Проверьте версию:

import pydantic print(pydantic.__version__) # должно быть 2.x

#Первая модель

Создадим простую модель пользователя:

from pydantic import BaseModel class User(BaseModel): id: int name: str email: str age: int is_active: bool = True # поле со значением по умолчанию # Создание экземпляра с валидацией user = User( id=1, name="Alice", email="alice@example.com", age=25 ) print(user) # User(id=1, name='Alice', email='alice@example.com', age=25, is_active=True) print(user.name) # Alice print(user.dict()) # {'id': 1, 'name': 'Alice', ...}

#Автоматическое преобразование типов

Pydantic пытается преобразовать данные к нужному типу:

# Строка преобразуется в int user = User(id="1", name="Bob", email="bob@example.com", age="30") print(user.age) # 30 (int, не строка!) # Список из кортежа class Data(BaseModel): numbers: list[int] data = Data(numbers=(1, 2, 3)) # кортеж преобразуется в список

Если преобразование невозможно — получаем ValidationError:

from pydantic import ValidationError try: User(id="not_a_number", name="Bob", email="bob@example.com", age=25) except ValidationError as e: print(e) # 1 validation error for User # id # Input should be a valid integer [...]

#Валидация по умолчанию

Даже без явных валидаторов Pydantic проверяет:

  1. Обязательные поля — поля без значения по умолчанию обязательны
  2. Типы данных — соответствие аннотаций типов
  3. None для необязательных полей — Optional[T] или T | None разрешают None
class Product(BaseModel): id: int # обязательное name: str # обязательное description: str = None # необязательное, может быть None price: float = 0.0 # необязательное, значение по умолчанию # Ошибка: отсутствует обязательное поле Product(id=1) # ValidationError: Field required # OK: все обязательные поля есть Product(id=1, name="Widget") # OK: можно передать None для description Product(id=1, name="Widget", description=None)

#Методы модели

BaseModel предоставляет множество полезных методов:

user = User(id=1, name="Alice", email="alice@example.com", age=25) # Преобразование в dict user_dict = user.model_dump() # {'id': 1, 'name': 'Alice', 'email': 'alice@example.com', 'age': 25, 'is_active': True} # Преобразование в JSON json_str = user.model_dump_json(indent=2) # '{\n "id": 1,\n "name": "Alice",\n ...' # Копирование с изменениями user2 = user.model_copy(update={"name": "Alicia"}) # Валидация из dict data = {"id": 2, "name": "Bob", "email": "bob@example.com", "age": 30} user3 = User.model_validate(data)

#Мини-проект: Модель статьи блога

Создайте модель BlogPost со следующими требованиями:

from pydantic import BaseModel from datetime import datetime class BlogPost(BaseModel): # id: целое число, обязательное # title: строка, обязательное # content: строка, обязательное # author: строка, обязательное # tags: список строк, по умолчанию пустой список # published: булево, по умолчанию False # created_at: datetime, по умолчанию текущее время pass # Пример использования: post = BlogPost( id=1, title="Введение в Pydantic", content="Pydantic — мощная библиотека...", author="Alice", tags=["python", "pydantic", "validation"] ) print(post.title) # "Введение в Pydantic" print(post.tags) # ["python", "pydantic", "validation"] print(post.published) # False (значение по умолчанию) print(post.created_at) # datetime.datetime(2026, 3, 18, ...)

Проверьте, что:

  • Модель валидирует обязательные поля
  • Преобразует типы (например, строку в datetime, если возможно)
  • Работают значения по умолчанию
  • model_dump() возвращает корректный словарь

Далее: Типы полей: от простых к сложным