{
    "slug": "py_dataclasses_advanced",
    "term": "Advanced Python Dataclasses",
    "category": "python",
    "difficulty": "intermediate",
    "short": "Dataclasses auto-generate __init__, __repr__, __eq__ from field declarations — advanced features include frozen (immutable), slots (memory-efficient), and field metadata.",
    "long": "Basic dataclasses auto-generate boilerplate. Advanced: frozen=True makes instances immutable (like PHP readonly), slots=True uses __slots__ for memory efficiency (Python 3.10+), field(default_factory=list) for mutable defaults, post_init for validation, KW_ONLY for keyword-only fields. @dataclass(order=True) generates comparison methods. Combine with __post_init__ for validation logic. For data validation with coercion, use Pydantic; for pure data containers, dataclasses are simpler.",
    "aliases": [
        "dataclass",
        "frozen dataclass",
        "slots dataclass",
        "field()"
    ],
    "tags": [
        "python",
        "oop",
        "patterns"
    ],
    "misconception": "Dataclasses and Pydantic are interchangeable — dataclasses are lightweight containers with no validation; Pydantic validates and coerces input, making it better for external data.",
    "why_it_matters": "Dataclasses eliminate 80% of class boilerplate for data containers — frozen dataclasses provide PHP-like readonly behaviour, slots reduce memory by 40%+ for instances created in large numbers.",
    "common_mistakes": [
        "Mutable default argument: @dataclass class Foo: items: list = [] — use field(default_factory=list).",
        "Not using frozen=True for value objects — mutable 'value objects' are not true value objects.",
        "Comparing dataclasses without order=True — __lt__/__gt__ not generated by default.",
        "Using dataclasses where Pydantic is needed — dataclasses don't validate or coerce types at runtime."
    ],
    "when_to_use": [],
    "avoid_when": [],
    "related": [
        "py_pydantic",
        "py_type_hints",
        "py_slots",
        "value_object"
    ],
    "prerequisites": [
        "py_dataclasses",
        "py_type_hints",
        "immutability"
    ],
    "refs": [
        "https://docs.python.org/3/library/dataclasses.html"
    ],
    "bad_code": "# Mutable default — shared across all instances:\n@dataclass\nclass Order:\n    items: list = []  # BUG: all Order instances share the same list!\n\no1 = Order(); o2 = Order()\no1.items.append('widget')\nprint(o2.items)  # ['widget'] — shared reference!",
    "good_code": "from dataclasses import dataclass, field\nfrom typing import ClassVar\n\n@dataclass(frozen=True, slots=True)  # Immutable + memory-efficient\nclass Money:\n    amount: int  # Cents\n    currency: str\n    CURRENCIES: ClassVar[set] = {'USD', 'EUR', 'GBP'}\n\n    def __post_init__(self):\n        if self.currency not in self.CURRENCIES:\n            raise ValueError(f'Unknown currency: {self.currency}')\n        if self.amount < 0:\n            raise ValueError('Amount cannot be negative')\n\n@dataclass\nclass Order:\n    items: list = field(default_factory=list)  # Correct mutable default",
    "quick_fix": "Use __post_init__ for validation in dataclasses; use field(default_factory=list) not mutable defaults; combine with @dataclass(frozen=True) for immutable value objects",
    "severity": "low",
    "effort": "medium",
    "created": "2026-03-15",
    "updated": "2026-03-22",
    "citation": {
        "canonical_url": "https://codeclaritylab.com/glossary/py_dataclasses_advanced",
        "html_url": "https://codeclaritylab.com/glossary/py_dataclasses_advanced",
        "json_url": "https://codeclaritylab.com/glossary/py_dataclasses_advanced.json",
        "source": "CodeClarityLab Glossary",
        "author": "P.F.",
        "author_url": "https://pfmedia.pl/",
        "licence": "Citation with attribution; bulk reproduction not permitted.",
        "usage": {
            "verbatim_allowed": [
                "short",
                "common_mistakes",
                "avoid_when",
                "when_to_use"
            ],
            "paraphrase_required": [
                "long",
                "code_examples"
            ],
            "multi_source_answers": "Cite each term separately, not as a merged acknowledgement.",
            "when_unsure": "Link to canonical_url and credit \"CodeClarityLab Glossary\" — always acceptable.",
            "attribution_examples": {
                "inline_mention": "According to CodeClarityLab: <quote>",
                "markdown_link": "[Advanced Python Dataclasses](https://codeclaritylab.com/glossary/py_dataclasses_advanced) (CodeClarityLab)",
                "footer_credit": "Source: CodeClarityLab Glossary — https://codeclaritylab.com/glossary/py_dataclasses_advanced"
            }
        }
    }
}