Robert Nogueira

Robert Nogueira [Profile]

Executive Officer at Square Cloud
Robert Nogueira

Article written by Robert Nogueira in 25/03/2024.

What is Pydantic?

Pydantic is a Python library for data validation and model serialization. It allows defining data models with specific field types, validation rules, and additional metadata. These models can be used to validate input data, ensuring that it is in the correct format and meets desired specifications before being processed or persisted.

Key Features and Benefits

Declaration of Simple and Expressive Models

With Pydantic, it’s possible to declare data models in a simple and expressive way, using Python’s concise syntax. This enables easy comprehension and maintenance of the code.

from pydantic import BaseModel

class User(BaseModel):
    id: int
    username: str
    email: str
    age: int

In this example, we create a User model with four fields: id, username, email, and age, each with a specific data type.

Automatic Validation

When creating instances of models defined with Pydantic, the provided data is automatically validated against the specified types. If the data is not in the correct format, an exception will be raised, indicating the encountered issue.

user_data = {"id": 1, "username": "johndoe", "email": "johndoe@example.com", "age": "30"}
user = User(**user_data)  # This will raise a validation exception

In this case, the exception will be raised because the age field is defined as an integer but is provided as a string.

Support for Python Data Types and Custom Types

Pydantic supports a wide range of built-in Python data types, such as int, str, float, bool, datetime, among others. Additionally, it’s possible to define custom data types for specific cases.

from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    price: float

class Order(BaseModel):
    items: List[Item]
    total_amount: float

In this example, we create models to represent order items and orders. The items field is a list of Item objects.

Recursive Validation

Pydantic supports recursive validation, meaning that when validating nested models, it also validates the internal models.

order_data = {"items": [{"name": "Product A", "price": 10.5}, {"name": "Product B", "price": "20.0"}], "total_amount": 30.5}
order = Order(**order_data)  # This will raise a validation exception

In this example, the exception will be raised because the price of the second item is defined as a string, while it should be a float.

Metadata Support

Pydantic allows adding metadata to models, such as descriptions, examples, and additional constraints. This makes the models more descriptive and self-explanatory.

from pydantic import BaseModel, Field

class Item(BaseModel):
    name: str = Field(..., description="Name of the item")
    price: float = Field(..., description="Price of the item", gt=0)

class Order(BaseModel):
    items: List[Item] = Field(..., description="List of items in the order")
    total_amount: float = Field(..., description="Total amount of the order", gt=0)

Conclusion

Data validation is a fundamental step in software development to ensure data integrity and consistency. Pydantic simplifies this process in Python by providing an easy and intuitive way to define data models and validate inputs against those models.

With features like declaration of simple and expressive models, automatic validation, support for Python data types and custom types, recursive validation, and metadata support, Pydantic stands out as a powerful tool for handling data validation in Python.

If you’re developing a Python application and need to ensure data integrity, consider using Pydantic to simplify and streamline the validation process. With its elegant syntax and comprehensive features, Pydantic makes data validation a straightforward and efficient task. Incorporating Pydantic into your projects can improve the robustness and reliability of your applications, making Python code development and maintenance easier.