Для ключа с равенством по значению нужны согласованные 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 помогает отображению, но для ключа не обязателен. Это протокол хешируемости, а не автоматическое кеширование результатов вычислений.