Иммутабельные dataclass-ы и `frozen=True`
Python
Senior
Яндекс
Как создать неизменяемый `dataclass`? Какие ограничения появляются при `frozen=True` и как при этом реализовать кеширование уже вычисленного значения (memoization) в поле?
Ответы
frozen dataclass и кеш
`@dataclass(frozen=True)` делает экземпляры неизменяемыми: любые попытки присвоить атрибуту новое значение приводят к `FrozenInstanceError`.
Для ленивого кеширования можно использовать `object.__setattr__` (обход проверки) и приватное поле:
```python
from dataclasses import dataclass, field
@dataclass(frozen=True)
class User:
name: str
_slug: str | None = field(default=None, init=False, repr=False)
@property
def slug(self) -> str:
if self._slug is None:
value = self.name.lower().replace(' ', '-')
object.__setattr__(self, '_slug', value)
return self._slug
```