179 – Immutable dataclasses

179 – Immutable dataclasses#

By default, dataclasses are mutable:

from dataclasses import dataclass

@dataclass
class Currency:
    name: str
    symbol: str

euro = Currency("euro", "€")
euro.name = "dollar"
print(euro)
# Currency(name='dollar', symbol='€')

The snippet above shows that the name of the currency euro was changed to dollar.

However, the decorator dataclass provides a convenient way to create immutable classes. To do that, just set frozen=True in the decorator:

from dataclasses import dataclass

@dataclass(frozen=True)
class Currency:
    name: str
    symbol: str

euro = Currency("euro", "€")
euro.name = "dollar"
# dataclasses.FrozenInstanceError

If you try to mutate an immutable dataclass you get the error dataclasses.FrozenInstanceError.