Объект должен быть хешируемым: иметь стабильный hash и согласованный eq. Равные объекты обязаны иметь одинаковый хеш; поля, участвующие в нём, нельзя менять, пока объект служит ключом.
У меня есть кастомный самописный класс. Я хочу, чтобы он был ключом словаря. Что я должен сделать?
Объект должен быть хешируемым: иметь стабильный __hash__ и согласованный __eq__. Равные объекты обязаны иметь одинаковый хеш; поля, участвующие в нём, нельзя менять, пока объект служит ключом.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Объект должен быть хешируемым: иметь стабильный hash и согласованный eq. Равные объекты обязаны иметь одинаковый хеш; поля, участвующие в нём, нельзя менять, пока объект служит ключом.
Простой класс по умолчанию обычно использует идентичность и уже может быть ключом. Если нужна семантика по значению, удобен неизменяемый объект:
from dataclasses import dataclass
@dataclass(frozen=True)
class Key:
tenant: str
number: int
Для такой модели поля тоже должны быть хешируемыми. При самостоятельном переопределении __eq__ не забывайте о __hash__: Python обычно отключает у класса хеширование, если равенство изменено без согласованного хеша.