Skip to content
GreenSnippets

Dataclass with validation

Validate and normalize fields in __post_init__ so invalid objects can never be created.

Python
from dataclasses import dataclass


@dataclass(frozen=True)
class User:
    name: str
    email: str
    age: int

    def __post_init__(self):
        if not self.name.strip():
            raise ValueError("name is required")
        if "@" not in self.email:
            raise ValueError("email is invalid")
        if not 0 <= self.age <= 150:
            raise ValueError("age out of range")
        object.__setattr__(self, "email", self.email.strip().lower())

Example / expected output

Output
User("Ada", "ADA@Example.com", 36).email  # 'ada@example.com'

How it works

Dataclasses remove boilerplate but do not validate. __post_init__ runs after the generated __init__, so it is the place to check ranges and normalize values. frozen=True makes instances immutable, which keeps the validated state valid.