Реализация полного протокола хешируемости для объекта

Для ключа с равенством по значению нужны согласованные __eq__ и __hash__: равные объекты обязаны иметь равный хеш, а хеш не должен меняться за время нахождения в словаре. Дополнительные dunder-методы не обязательны.

Короткий ответ

Что ответить на собеседовании

Для ключа с равенством по значению нужны согласованные eq и hash: равные объекты обязаны иметь равный хеш, а хеш не должен меняться за время нахождения в словаре. Дополнительные dunder-методы не обязательны.

Подробный разбор

Ответ с пояснениями

Условие

В задании описывается протокол кеширования объекта, который требует не только реализации метода hash, но и ряда дополнительных dunder‑методов, обеспечивающих корректную работу экземпляра в качестве ключа словаря. Необходимо добавить недостающие специальные методы, чтобы объект типа HashList мог выступать в роли ключа.

Ответ

Для ключа с равенством по значению нужны согласованные eq и hash: равные объекты обязаны иметь равный хеш, а хеш не должен меняться за время нахождения в словаре. Дополнительные dunder-методы не обязательны.

Пример неизменяемого значения:

from dataclasses import dataclass

@dataclass(frozen=True)
class HashList:
    values: tuple[int, ...]

    def __init__(self, values):
        object.__setattr__(self, 'values', tuple(values))

Dataclass генерирует согласованные методы сравнения и хеширования. tuple защищает от изменения исходного списка после создания. Здесь порядок чисел значим; для множества нужен иной контракт. repr помогает отображению, но для ключа не обязателен. Это протокол хешируемости, а не автоматическое кеширование результатов вычислений.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее