Data Models and Validation
Pydantic, dataclasses, and data validation patterns.
Overview
Master data modeling patterns.
Dataclasses
from dataclasses import dataclass, field
from typing import List
@dataclass
class User:
name: str
email: str
age: int
hobbies: List[str] = field(default_factory=list)
def greet(self):
return f"Hello, {self.name}!"
user = User("Alice", "alice@example.com", 25, ["reading", "coding"])
print(user.greet())
Pydantic Models
from pydantic import BaseModel, EmailStr, validator
from typing import Optional
class User(BaseModel):
name: str
email: EmailStr
age: int
bio: Optional[str] = None
@validator('age')
def age_must_be_positive(cls, v):
if v < 0:
raise ValueError('Age must be positive')
return v
@validator('name')
def name_must_not_be_empty(cls, v):
if not v.strip():
raise ValueError('Name cannot be empty')
return v.strip()
# Usage
user = User(name="Alice", email="alice@example.com", age=25)
print(user.dict())
Validation Patterns
from pydantic import BaseModel, validator
from typing import List
class Order(BaseModel):
items: List[str]
total: float
@validator('total')
def total_must_be_positive(cls, v):
if v <= 0:
raise ValueError('Total must be positive')
return round(v, 2)
@validator('items')
def items_cannot_be_empty(cls, v):
if not v:
raise ValueError('Items list cannot be empty')
return v
order = Order(items=["apple", "banana"], total=5.99)
print(order)
Practice
Create a Pydantic model for a complex form with validation.