Контракт: если a == b (__eq__), то hash(a) == hash(b). Если ты переопределяешь __eq__ и не переопределяешь __hash__, Python автоматически делает __hash__ = None, и объект становится unhashable (нельзя в set/dict). Поэтому при кастомном __eq__ всегда определяй __hash__. Обратное неверно: hash(a) == hash(b) не означает a == b (коллизии). Для mutable объектов обычно не определяют __hash__ — потому что если объект изменится, его хеш изменится, и он потеряется в dict/set.
Как связаны __eq__ и __hash__?
Middle
235 просмотровAFK Offer AI
Как использовать GraphQL в Python?