Развёрнутое пояснение:
1. Декоратор dataclass(frozen=True) генерирует для Client методы __init__, __repr__, __eq__ и __hash__.
2. __eq__ у frozen dataclass сравнивает все поля экземпляров. У a name='a', у b name='b', поэтому a!= b.
3. __hash__ тоже строится по всем полям, поэтому hash(a)!= hash(b).
4. Словарь cache размещает a и b в разные корзины. После cache[a] = 'old' и cache[b] = 'new' в словаре два элемента.
5. Обращение cache[a] возвращает значение, связанное с a, то есть 'old'. Итоговый вывод: old 2.
Почему это важно: dataclass часто используют как ключи dict или элементы set, и поведение зависит от того, какие поля входят в равенство. frozen=True решает проблему изменяемости, но не помогает, если логика идентичности подразумевает только часть полей. В реальном коде это приводит к дублям в кеше, утечке памяти и неверным попаданиям при поиске.
Post #4872
274
Python: задачки и вопросы
- ✍ 1