ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ . ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠΉ Π½Π° 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!
Raman Sapezhka
CEO Plantago/CTO