Get Appointment

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

БоврСмСнная Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ эффСктивных инструмСнтов для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Π΄Π°Π½Π½Ρ‹Ρ…. Одним ΠΈΠ· самых популярных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π½Π° Python сСгодня являСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pydantic. Благодаря своСй простотС, ΠΌΠΎΡ‰Π½Ρ‹ΠΌ возмоТностям ΠΈ высокой ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Pydantic ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ большой ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒΡŽ срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… FastAPI, Django, Flask ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим соврСмСнныС способы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ схСм Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Ρ‡Π΅Ρ€Π΅Π· Pydantic, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ прСимущСства использования этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ….

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Pydantic?

Pydantic β€” это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Python для Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ². Она позволяСт ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ автоматичСски ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ входящиС значСния, обСспСчивая Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Pydantic построСн Π½Π° стандартных dataclasses ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с API, Ρ„ΠΎΡ€ΠΌΠ°ΠΌΠΈ, конфигурациями ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ структурами Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° использования Pydantic

  • АвтоматичСская валидация Π΄Π°Π½Π½Ρ‹Ρ…: Pydantic провСряСт соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ², Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… характСристик Π΄Π°Π½Π½Ρ‹Ρ….
  • БСриализация ΠΈ дСсСриализация: МодСли Π»Π΅Π³ΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ Π² JSON ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с REST API.
  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ интСграция с соврСмСнными Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ: FastAPI, Starlette, Django ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Pydantic для описания ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ схСм Π΄Π°Π½Π½Ρ‹Ρ….
  • Высокая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ: Pydantic написан Π½Π° Cython ΠΈ обСспСчиваСт Π±Ρ‹ΡΡ‚Ρ€ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ….
  • Π“ΠΈΠ±ΠΊΠΈΠ΅ схСмы: ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, алиасов, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ кастомных ошибок.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ схСм Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ с Pydantic

Основная идСя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Pydantic β€” описаниС ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ классов, наслСдуСмых ΠΎΡ‚ BaseModel. НапримСр:

from pydantic import BaseModel, Field

class User(BaseModel):
    id: int
    name: str = Field(..., min_length=2, max_length=50)
    email: str

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ модСль User автоматичСски провСряСт Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ примСняСт ограничСния ΠΊ полю name. ΠŸΡ€ΠΈ создании экзСмпляра класса всС поля проходят ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΡŽ.

БСриализация Π΄Π°Π½Π½Ρ‹Ρ… с Pydantic

ВстроСнныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ dict() ΠΈ json() ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ быстро ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² словари ΠΈΠ»ΠΈ JSON-строки:

user = User(id=1, name="Иван", email="[email protected]")
user_dict = user.dict()
user_json = user.json()

Π­Ρ‚ΠΎ особСнно ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· API ΠΈΠ»ΠΈ сохранСнии ΠΈΡ… Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Валидация Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΈ слоТных структур

Pydantic прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ модСлями ΠΈ коллСкциями:

class Address(BaseModel):
    city: str
    street: str

class UserWithAddress(BaseModel):
    name: str
    address: Address

Валидация Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… структур происходит автоматичСски, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с комплСксными Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ошибки

Pydantic ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π° @validator:

from pydantic import validator

class User(BaseModel):
    email: str

    @validator('email')
    def valid_email(cls, v):
        if '@' not in v:
            raise ValueError('НСкоррСктный email')
        return v

Π­Ρ‚ΠΎ позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ спСцифичСскиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с FastAPI ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ

FastAPI ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Pydantic для описания Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… эндпоинтов:

from fastapi import FastAPI
app = FastAPI()

@app.post("/user/")
async def create_user(user: User):
    return user

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, автоматичСски Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΡΠ΅Ρ€ΠΈΠ°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ.

Валидация ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с внСшними источниками

Pydantic позволяСт ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ слоТныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запуска, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· окруТСния ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ класс BaseSettings.

Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ с Pydantic

  • ИспользованиС алиасов ΠΏΠΎΠ»Π΅ΠΉ β€” для соотвСтствия внСшним Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΌ названиям.
  • Π Π°Π±ΠΎΡ‚Π° с Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½Ρ‹ΠΌΠΈ значСниями Ρ‡Π΅Ρ€Π΅Π· Optional ΠΈ default.
  • Випизация с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных Ρ‚ΠΈΠΏΠΎΠ² Python β€” List, Dict, Union ΠΈ Π΄Ρ€.
  • Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· наслСдованиС β€” для создания ΠΌΠ½ΠΎΠ³ΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… схСм Π΄Π°Π½Π½Ρ‹Ρ….

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ИспользованиС Pydantic Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΈ ускоряСт процСсс Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Π΄Π°Π½Π½Ρ‹Ρ… Π² соврСмСнных Π²Π΅Π±-прилоТСниях. Благодаря ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ гибкости, эта Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° стала стандартом для ΠΌΠ½ΠΎΠ³ΠΈΡ… Python-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ эффСктивныС схСмы Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ ΠΈ сСриализации Π΄Π°Π½Π½Ρ‹Ρ… Π² свой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ ΠΈΡ‰Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π½Π°ΠΌ β€” ΠΌΡ‹ ΠΏΠΎΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ Π½Π° Π±Π°Π·Π΅ Pydantic!

Avatar
Raman Sapezhka

CEO Plantago/CTO