pythonintermediate

Dataclass with __post_init__ Validation

Add custom validation to Python dataclasses using __post_init__.

python
from dataclasses import dataclass, field
from typing import List

@dataclass
class User:
    name: str
    email: str
    age: int
    tags: List[str] = field(default_factory=list)

    def __post_init__(self):
        if not self.name.strip():
            raise ValueError("Name cannot be empty")
        if "@" not in self.email:
            raise ValueError(f"Invalid email: {self.email}")
        if not 0 < self.age < 150:
            raise ValueError(f"Invalid age: {self.age}")
        self.name = self.name.strip()
        self.email = self.email.lower().strip()

user = User(name="Alice", email="Alice@Example.com", age=30)
print(user)  # User(name='Alice', email='alice@example.com', age=30)

Use Cases

  • Input validation
  • Config objects
  • Domain models

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.