Python › Dataclasses & NamedTuples

When would you choose a NamedTuple over a @dataclass, and vice versa, given their overlapping use cases?

Advanced

Answer

Choose NamedTuple when you want tuple-like behavior (positional unpacking, iteration, indexing, natural immutability, and lower memory overhead) for simple, lightweight records; choose @dataclass when you need MUTABILITY (unless frozen), custom methods/validation via __post_init__, inheritance, or don't need tuple-style unpacking/indexing semantics.
from typing import NamedTuple
from dataclasses import dataclass

class PointTuple(NamedTuple):  # lightweight, tuple-like, unpacking works
    x: int; y: int
x, y = PointTuple(1, 2)  # tuple unpacking works naturally

@dataclass
class PointClass:  # mutable, supports validation, no tuple unpacking
    x: int; y: int
Real-world example Choosing NamedTuple for a simple return value that benefits from tuple unpacking, versus a dataclass for a mutable domain entity with validation.

Common follow-ups: Can a dataclass be made to support tuple-style unpacking too, by implementing __iter__?