pythonbeginner
Dataclass with Validation
Python dataclass with __post_init__ field validation, type coercion, and descriptive error messages.
pythonPress ⌘/Ctrl + Shift + C to copy
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.
pythonintermediate
Python Dataclass Advanced Patterns
Advanced dataclass usage with validation, post-init processing, slots, and frozen instances.
Best for: Type-safe data models without ORMs
#python#dataclass
pythonintermediate
Dataclass with __post_init__ Validation
Add custom validation to Python dataclasses using __post_init__.
Best for: Input validation
#python#dataclass
pythonbeginner
Dataclasses with Post-Init Processing
Use Python dataclasses with __post_init__ for computed fields, validation, and default factories.
Best for: Domain models
#dataclasses#python
pythonadvanced
Python Advanced Typing Patterns
Advanced type hints with Protocol, TypeVar, Generic, overload, and TypeGuard for safer code.
Best for: Building type-safe generic containers
#python#typing