Pydantic valida i serialitza de manera automàtica les dades JSON que consumeixes o produeixes.
Introducció
Pydantic és una biblioteca de validació de dades que utilitza Typing
Entorn de treball
Instal·la la biblioteca pydantic:
uv add pydanticSi utilitzes PyCharm com a editor, pots utilitzar el Plugin Pydantic per PyCharm.
Millora el suport de l’editor per als models Pydantic, amb: autocompletat, comprovacions de tipus, refactorització, cerca o inspeccions.
Models
Un model és una classe que hereta de BaseModel i anota amb tipus els atributs de la classe.
Són molt semblants a un @dataclass, excepte que estan pensants per:
- La validació i serialització de dades JSON
- La generació d’esquemes JSON.
Per serialitzar dades, Pydantic utilitzar una llibreria escrita en Rust: jiter
A continuació tens un exemple d’una classe User que hereta de BaseModel i defineix camps com a atributs anotats:
:
: | None = NoneLlavors el model es pot instanciar:
: = La inicialització de l’objecte fa tota l’anàlisi i validació.
Si no s’aixeca cap excepció ValidationError, saps que la instància del model resultant és vàlida:
assert user.id == 1
assert user.name == "David" Però si escrius aquest codi, PyCharm et dirà que és erroni:
:
: | None = None
: = I pydantic genera un error en temps d’execució
S’aixecarà una única excepció independentment del nombre d’errors trobats, i aquell error de validació contindrà informació sobre tots els errors i com es van produir.
Per defecte, els models són mutables i els valors dels camps es poden canviar mitjançant l’assignació d’atributs:
= 321
assert == 321Validant dades
Pydantic utilitza un dict per guardar les dades: podem passar directament un “punter” a un dict per crear un User.
Si crees objectes a partir de dades de sistemes externs, no hi ha cap garantia que siguin correctes:
:
: | None = None
: =
=
# Error de validacióPydantic proporciona tres mètodes a les classes de model per analitzar dades:
model_validate()
Això és molt similar al mètode __init__ del model, excepte que pren un diccionari o un objecte en lloc d’arguments amb paraula clau.
Si l’objecte passat no es pot validar, o si no és un diccionari o una instància del model en qüestió, s’aixecarà un ValidationError.
:
: =
: | None = None
=
try:
User.model_validate(['not', 'a', 'dict'])
except ValidationError as e:
print(e)1 validation error for User
Input should be a valid dictionary or instance of User [type=model_type, input_value=['not', 'a', 'dict'], input_type=list]
For further information visit https://errors.pydantic.dev/2.11/v/model_typemodel_validate_json()
Això valida les dades proporcionades com un string JSON o objecte bytes. Si les teves dades entrants són una càrrega útil JSON, generalment es considera més ràpid (en lloc d’analitzar manualment les dades com un diccionari).
=
id=123 name='James' signup_ts=None
=
1 validation error for User
name
Input should be a valid string [type=string_type, input_value=123, input_type=int]
For further information visit https://errors.pydantic.dev/2.11/v/string_type
=
1 validation error for User
Invalid JSON: expected value at line 1 column 1 [type=json_invalid, input_value='invalid JSON', input_type=str]
For further information visit https://errors.pydantic.dev/2.11/v/json_invalidmodel_validate_strings()
Ppren un diccionari (pot estar niuat) amb claus i valors de tipus string i valida les dades en mode JSON perquè aquestes strings puguin ser convertides als tipus correctes.
=
#> id=123 name='James' signup_ts=None
=
)
#> id=123 name='James' signup_ts=datetime.datetime(2024, 4, 1, 12, 0)
= , =True
)
"""
1
, , ``, ``, `` or
"""Serialització
La instància del model es pot serialitzar utilitzant el mètode model_dump:
assert == El mètode .model_dump_json() serialitza un model directament a un string codificat en JSON que és equivalent al resultat produït per .model_dump().
:
:
:
=
#> {"foo":"2032-06-01T12:13:14","bar":{"whatever":123}}
"""
: ,
: : 123
}
}
"""Models niuats
Un model pot utilitzar altres models.
Si tens aquest diagrama:
Pots escriure aquest codi:
:
:
:
:
=
: =
assert == 45Activitat
Genera les classes corresponents a aquest diagrama:
Show solution
TODO
Crea un objecte Order a partir d’un dict:
Show solution
TODO
Field
La funció Field s’utilitza per personalitzar i afegir metadades als camps dels models.
Restriccions numèriques
Hi ha alguns arguments amb paraula clau que es poden utilitzar per restringir valors numèrics:
gt- major quelt- menor quege- major o igual quele- menor o igual quemultiple_of- un múltiple del nombre donatallow_inf_nan- permet valors'inf','-inf','nan'
Aquí tens un exemple:
: =
: =
: =
: =
: =
: =
= =1,
=0,
=-1,
=0,
=2,
=,
)
positive=1 non_negative=0 negative=-1 non_positive=0 even=2 love_for_pydantic=infRestriccions de strings
Hi ha camps que es poden utilitzar per restringir strings:
min_length: Longitud mínima de la cadena.max_length: Longitud màxima de la cadena.pattern: Una expressió regular que la cadena ha de complir.
Aquí tens un exemple:
: =
: =
: =
=
short='foo' long='foobarbaz' regex='123'Immutabilitat
El paràmetre frozen s’utilitza per emular el comportament de dataclass congelat. S’utilitza per evitar que el camp rebi un valor nou després que el model es crea (immutabilitat).
: =
:
=
=
"""
1
is
"""Més informació a Concepts - Fields
JSON
Parsing
Amb pydantic pots consumir dades JSON.
En aquest exemple, demanes que la validació sigui estricta:
Pydantic proporciona anàlisi JSON integrat, que ajuda a aconseguir:
=
:
:
: =
: =
assert == 51Extra Models
TODO
Settings
Pydantic Settings provides optional Pydantic features for loading a settings or config class from environment variables or secrets files.