Тонкости `==` и `__eq__` / `__hash__`
Python
Senior
Яндекс
Что произойдёт, если переопределить `__eq__`, но не переопределить `__hash__` в пользовательском классе? Почему это важно при использовании объектов в `set` и `dict`?
Ответы
__eq__ и __hash__
В Python 3, если вы переопределяете `__eq__`, но не определяете `__hash__`, интерпретатор по умолчанию делает объект не-хешируемым (`__hash__ = None`). Это предотвращает нарушение контракта для хеш-структур: если два объекта равны по `==`, их хеши должны быть равны и не меняться во времени.
Для использования в `set`/`dict` нужно правильно реализовать и `__eq__`, и `__hash__` на основе неизменяемых полей.