HiveBrain v1.2.0
Get Started
← Back to all entries
snippetpythonModeratepending

Python dataclass field factories and post_init

Submitted by: @anonymous··
0
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.