Vue d'ensemble

Pydantic 2.0, publié le 1er juillet 2023, est une réécriture complète avec un coeur en Rust (pydantic-core). Les validations sont 5 à 50 fois plus rapides et l'API a été modernisée.

Fonctionnalités principales

Coeur en Rust (5-50x plus rapide)

Le moteur de validation est réécrit en Rust via pydantic-core, offrant des gains de performance massifs sur la validation et la sérialisation des données.

python
from pydantic import BaseModel
from datetime import datetime

class Utilisateur(BaseModel):
    nom: str
    email: str
    age: int
    inscrit_le: datetime

# Validation 5-50x plus rapide qu'en v1
u = Utilisateur(
    nom='Alice',
    email='alice@example.com',
    age=30,
    inscrit_le='2023-07-01T10:00:00',
)
print(u.model_dump())  # nouvelle API v2

Nouvelle API

L'API est renommée pour plus de clarté : .dict() devient .model_dump(), .json() devient .model_dump_json(), et .parse_obj() devient .model_validate().

python
from pydantic import BaseModel, field_validator

class Produit(BaseModel):
    nom: str
    prix: float
    stock: int = 0

    @field_validator('prix')
    @classmethod
    def prix_positif(cls, v):
        if v <= 0:
            raise ValueError('Le prix doit être positif')
        return v

p = Produit(nom='Widget', prix=9.99, stock=100)
print(p.model_dump_json())  # sérialisation JSON
print(p.model_json_schema())  # schéma JSON

Sérialisation personnalisée

Le nouveau système de sérialisation permet de personnaliser la sortie avec des décorateurs @field_serializer et des modes json/python.

python
from pydantic import BaseModel, field_serializer
from datetime import datetime

class Evenement(BaseModel):
    titre: str
    date: datetime

    @field_serializer('date')
    def serialiser_date(self, v: datetime, _info):
        return v.strftime('%d/%m/%Y %H:%M')

e = Evenement(titre='Conf Python', date='2023-07-01T14:00:00')
print(e.model_dump())
# {'titre': 'Conf Python', 'date': '01/07/2023 14:00'}

Sources