Dataclass with Validation
Python dataclass with __post_init__ field validation, type coercion, and descriptive error messages.
from dataclasses import dataclass, field
from datetime import datetime
@dataclass
class User:
name: str
email: str
age: int
roles: list[str] = field(default_factory=lambda: ["user"])
created_at: datetime = field(default_factory=datetime.now)
def __post_init__(self):
if not self.name or len(self.name.strip()) < 2:
raise ValueError("Name must be at least 2 characters")
if "@" not in self.email or "." not in self.email:
raise ValueError(f"Invalid email: {self.email}")
if not isinstance(self.age, int) or self.age < 0 or self.age > 150:
raise ValueError(f"Age must be between 0 and 150, got {self.age}")
self.name = self.name.strip()
self.email = self.email.lower().strip()
self.roles = [r.lower() for r in self.roles]
@property
def is_admin(self) -> bool:
return "admin" in self.roles
def to_dict(self) -> dict:
return {
"name": self.name,
"email": self.email,
"age": self.age,
"roles": self.roles,
"created_at": self.created_at.isoformat(),
}
# Usage:
# user = User(name="Ada", email="ada@example.com", age=30)
# user.to_dict()Use Cases
- Data transfer objects
- API request parsing
- Configuration objects
Tags
Related Snippets
Similar patterns you can reuse in the same workflow.
Dataclasses with Post-Init Processing
Use Python dataclasses with __post_init__ for computed fields, validation, and default factories.
Data Validation with Pydantic
Validate and parse data records using Pydantic models with custom validators and error reporting.
Custom Context Manager
Context managers for resource management using both class-based and decorator approaches with error handling.
Pytest Fixtures and Parametrize
Reusable pytest fixtures with scope control, parametrize for data-driven tests, and temporary resources.