У меня есть кастомный самописный класс. Я хочу, чтобы он был ключом словаря. Что я должен сделать?

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

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

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

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

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

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

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

Простой класс по умолчанию обычно использует идентичность и уже может быть ключом. Если нужна семантика по значению, удобен неизменяемый объект:

from dataclasses import dataclass

@dataclass(frozen=True)
class Key:
    tenant: str
    number: int

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

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

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

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

Подробнее