pythonbeginner

Dataclass with Validation

Python dataclass with __post_init__ field validation, type coercion, and descriptive error messages.

python
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.