Validate data with dataclasses

Use __post_init__ to reject bad values as soon as an object is created.

python-dataclass-validation.py
from dataclasses import dataclass, field


@dataclass
class Product:
    name: str
    price: float
    tags: list[str] = field(default_factory=list)

    def __post_init__(self):
        self.name = self.name.strip()
        if not self.name:
            raise ValueError("name is required")
        if self.price < 0:
            raise ValueError("price cannot be negative")


print(Product("  Notebook ", 4.5, ["paper"]))
try:
    Product("Pen", -1)
except ValueError as exc:
    print("rejected:", exc)