Развёрнутое пояснение:
1. Определяется класс Key с методом __eq__, который сравнивает атрибут val.
2. В Python класс, определяющий __eq__, но не определяющий __hash__, автоматически получает __hash__ = None.
3. При выполнении строки cache = {Key(1): 'hit'} Python пытается вычислить хеш ключа, чтобы разместить его в словаре.
4. Поскольку Key.__hash__ равен None, объект считается нехешируемым, и создание словаря падает с TypeError: unhashable type: 'Key'.
5. Вызов cache.get(Key(1)) не выполняется, потому что программа прерывается раньше.
Почему это важно: кастомные ключи для кэшей, конфигураций или агрегаций часто требуют своего сравнения. Если забыть реализовать __hash__, весь механизм ломается ещё на этапе создания dict или set. В dataclasses это решается через frozen=True для автоматического __hash__, а в собственных классах — явным определением __hash__.
Post #4775
553
Python: задачки и вопросы
- ✍ 2