snippetpythonModeratepending
Python dataclass field factories and post_init
Viewed 0 times
dataclassfielddefault_factorypost_initcomputed
Problem
Need mutable default values or computed fields in Python dataclasses.
Solution
Use field(default_factory=...) and __post_init__:
from dataclasses import dataclass, field
from datetime import datetime
from uuid import uuid4
@dataclass
class Task:
title: str
description: str = ''
tags: list[str] = field(default_factory=list)
id: str = field(default_factory=lambda: str(uuid4()))
created_at: datetime = field(default_factory=datetime.now)
# Computed field - excluded from __init__
slug: str = field(init=False)
def __post_init__(self):
self.slug = self.title.lower().replace(' ', '-')
# Validate
if not self.title.strip():
raise ValueError('Title cannot be empty')
# Inheritance
@dataclass
class PriorityTask(Task):
priority: int = 0
def __post_init__(self):
super().__post_init__()
if self.priority < 0:
raise ValueError('Priority must be >= 0')Why
field(default_factory=...) avoids the mutable default argument pitfall. __post_init__ runs after __init__ for validation and computed fields.
Context
Python data modeling with dataclasses
Revisions (0)
No revisions yet.