Una Guida Pratica all’Utilizzo di Pydantic in Python

Introduzione

Pydantic è una delle librerie Python più potenti e versatili per la validazione dei dati, la serializzazione e la trasformazione. Se hai mai lavorato con FastAPI, probabilmente ti sei già imbattuto in Pydantic, dato che è una delle sue dipendenze principali. Ma anche al di fuori di FastAPI, Pydantic si rivela uno strumento essenziale per chiunque debba gestire dati in modo sicuro ed efficiente.

In questo articolo, esploreremo come utilizzare Pydantic per validare e trasformare i dati, creare modelli complessi e gestire casi d’uso avanzati come la validazione personalizzata e l’uso di alias. Che tu sia un principiante o un programmatore esperto, questa guida ti aiuterà a padroneggiare Pydantic in modo pratico e diretto.

Cos’è Pydantic?

Pydantic è una libreria che combina le funzionalità delle classi dati (dataclasses) di Python con la validazione, la serializzazione e la trasformazione dei dati. In altre parole, Pydantic ti permette di definire modelli di dati che non solo strutturano le informazioni, ma le validano automaticamente, assicurandoti che siano corrette e nel formato desiderato.

Un Esempio di Base

Partiamo con un esempio semplice. Supponiamo di avere una funzione che richiede un nome e un cognome, e vogliamo assicurarci che entrambi siano stringhe.

from pydantic import BaseModel class MyFirstModel(BaseModel): first_name: str last_name: str # Validazione dei dati validating = MyFirstModel(first_name="marc", last_name="nealer")

In questo esempio, abbiamo creato un modello MyFirstModel che richiede due campi: first_name e last_name. Pydantic si assicura che entrambi i valori siano stringhe, altrimenti genera un errore di validazione.

Gestione di Parametri Opzionali

Spesso, i dati che riceviamo non sono sempre completi. Pydantic gestisce i parametri opzionali in modo elegante, ma la sintassi potrebbe non essere immediatamente intuitiva.

from pydantic import BaseModel from typing import Union, Optional class MySecondModel(BaseModel): first_name: str middle_name: Union[str, None] # Questo parametro può essere omesso title: Optional[str] # Questo parametro deve essere inviato, ma può essere None last_name: str

In questo caso, middle_name può essere omesso, mentre title deve essere inviato, anche se può essere None.

Valori di Default

Cosa succede se alcuni valori non vengono forniti? Pydantic permette di definire valori di default per i campi.

from pydantic import BaseModel, Field class DefaultsModel(BaseModel): first_name: str = "jane" middle_names: list = Field(default_factory=list) last_name: str = "doe"

Nota che per i campi come middle_names, che sono liste, è necessario utilizzare Field con default_factory per evitare che la stessa lista venga condivisa tra tutte le istanze del modello.

Modelli Annidati

Pydantic supporta anche la creazione di modelli annidati, utili quando si ha a che fare con strutture dati complesse.

from pydantic import BaseModel class NameModel(BaseModel): first_name: str last_name: str class UserModel(BaseModel): username: str name: NameModel

In questo esempio, UserModel contiene un campo name che è a sua volta un modello NameModel.

Validazione Personalizzata

Pydantic offre diverse opzioni per aggiungere validazioni personalizzate ai tuoi modelli. La validazione può essere eseguita prima o dopo la validazione di default.

Validazione dei Campi

Puoi definire validatori personalizzati utilizzando il decoratore BeforeValidator o AfterValidator.

from pydantic import BaseModel, BeforeValidator, ValidationError import datetime from typing import Annotated def stamp2date(value): if not isinstance(value, float): raise ValidationError("incoming date must be a timestamp") try: res = datetime.datetime.fromtimestamp(value) except ValueError: raise ValidationError("Time stamp appears to be invalid") return res class DateModel(BaseModel): dob: Annotated[datetime.datetime, BeforeValidator(stamp2date)]

In questo esempio, stamp2date converte un timestamp in un oggetto datetime prima della validazione di default.

Validazione del Modello

A volte, la validazione deve considerare più campi contemporaneamente. In questi casi, la validazione del modello è la soluzione ideale.

from pydantic import BaseModel, model_validator, ValidationError from typing import Union, Any class AllOptionalAfterModel(BaseModel): param1: Union[str, None] = None param2: Union[str, None] = None param3: Union[str, None] = None @model_validator(mode="after") def there_must_be_one(self): if not (self.param1 or self.param2 or self.param3): raise ValidationError("One parameter must be specified") return self

In questo esempio, il validatore there_must_be_one assicura che almeno uno dei tre parametri sia stato specificato.

Alias e Trasformazione dei Nomi dei Campi

Pydantic permette di gestire alias per i campi, utili quando i nomi dei campi nei dati in ingresso non corrispondono a quelli del modello.

from pydantic import AliasGenerator, BaseModel, ConfigDict class Tree(BaseModel): model_config = ConfigDict( alias_generator=AliasGenerator( validation_alias=lambda field_name: field_name.upper(), serialization_alias=lambda field_name: field_name.title(), ) ) age: int height: float kind: str t = Tree.model_validate({'AGE': 12, 'HEIGHT': 1.2, 'KIND': 'oak'}) print(t.model_dump(by_alias=True)) # Output: {'Age': 12, 'Height': 1.2, 'Kind': 'oak'}

In questo esempio, i nomi dei campi vengono trasformati durante la validazione e la serializzazione.

Conclusione

Pydantic è una libreria estremamente potente che semplifica la gestione dei dati in Python. Con la sua capacità di validare, trasformare e serializzare i dati, Pydantic è uno strumento indispensabile per chiunque lavori con dati strutturati.

Abbiamo visto come creare modelli di base, gestire parametri opzionali, definire valori di default, creare modelli annidati e aggiungere validazioni personalizzate. Inoltre, abbiamo esplorato come utilizzare alias per gestire i nomi dei campi in modo flessibile.

Ora che hai una solida base, ti incoraggio a sperimentare con Pydantic e a esplorare ulteriori funzionalità come la validazione avanzata e l’integrazione con altre librerie. Buon coding!

Domande Frequenti (FAQ)

1. Qual è la differenza tra Pydantic v1 e v2?
Pydantic v2 introduce diverse migliorie e cambiamenti rispetto alla versione 1, tra cui una maggiore flessibilità nella validazione e una migliore gestione degli alias. È importante fare riferimento alla documentazione ufficiale per i dettagli specifici.

2. Posso usare Pydantic con FastAPI?
Assolutamente sì! Pydantic è una delle dipendenze principali di FastAPI e viene utilizzato per validare i dati in ingresso e in uscita dalle API.

3. Come posso gestire errori di validazione complessi?
Pydantic fornisce un sistema di gestione degli errori molto flessibile. Puoi personalizzare i messaggi di errore e gestire casi d’uso complessi utilizzando validatori personalizzati.

Risorse Aggiuntive

Spero che questa guida ti sia stata utile! Se hai domande o suggerimenti, non esitare a lasciare un commento. Buona programmazione!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Translate »
Torna in alto