Vue d'ensemble

Pydantic 1.9, publie le 31 decembre 2021, ajoute les unions discriminees pour une validation plus efficace des modeles polymorphes.

Fonctionnalites principales

Unions discriminees

Les unions discriminees utilisent un champ discriminateur pour identifier le type concret, evitant de tester chaque variante et ameliorant les performances de validation.

python
from typing import Literal, Union
from pydantic import BaseModel, Field

class Chat(BaseModel):
    type: Literal['chat'] = 'chat'
    miaule: bool = True

class Chien(BaseModel):
    type: Literal['chien'] = 'chien'
    aboie: bool = True

class Foyer(BaseModel):
    animal: Union[Chat, Chien] = Field(discriminator='type')

# Validation rapide via le discriminateur
f1 = Foyer(animal={'type': 'chat', 'miaule': True})
f2 = Foyer(animal={'type': 'chien', 'aboie': False})
print(f1.animal)  # type='chat' miaule=True
print(f2.animal)  # type='chien' aboie=False

Ameliorations de validation

La validation est globalement plus rapide avec un meilleur support des types generiques et des validateurs personnalises enchaines.

python
from pydantic import BaseModel, validator

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

    @validator('email')
    def email_valide(cls, v):
        if '@' not in v:
            raise ValueError('Email invalide')
        return v.lower()

    @validator('age')
    def age_positif(cls, v):
        if v < 0:
            raise ValueError('Age doit etre positif')
        return v

u = Utilisateur(nom='Alice', email='Alice@Example.COM', age=30)
print(u.email)  # alice@example.com

Sources