Что такое Pydantic, зачем он нужен, установка и первый запуск. Базовая модель и валидация по умолчанию.
Pydantic — это не просто валидация, это язык описания данных в современном Python
Представьте, что вы пишете 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 автоматически:
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 проверяет:
Optional[T] или T | None разрешают Noneclass 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, ...)Проверьте, что:
model_dump() возвращает корректный словарьВ следующей теме изучим типы полей: встроенные типы Pydantic, валидацию строк, чисел, дат, списков и словарей.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.