Да, это плохая идея.Хеши не являются уникальными, объекты с одинаковыми хэшами не гарантированно также будут фактически равны:
>>> (-1, 0) == (-2, 0)
False
>>> hash((-1, 0)) == hash((-2, 0))
True
Хэши не означают быть уникальными;они являются средством быстрого выбора слота в хэш-таблице ограниченного размера , чтобы упростить O (1) поиск в словаре, а коллизии разрешены и ожидаемы .
Да, Python требует, чтобы одинаковые объекты имели одинаковые хэши, но это не значит, что отношения можно перевернуть.
Я просто сравниваю кортежи:
def __eq__(self, other):
return (self.a, self.b) == (other.a, other.b)
Если вынаписание большого количества классов данных , простых классов, которые требуют проверки на равенство и хэширования и т. д., используют модуль dataclasses
(Python 3.7 или более поздней версии, или backport):
from dataclasses import dataclass
@dataclass(frozen=True)
class MyObject:
a: int
b: int
Вышеупомянутый класс теперь поставляется с __hash__
и __equals__
методом:
>>> MyObject(-1, 0) == MyObject(-2, 0)
False
>>> hash(MyObject(-1, 0)) == hash(MyObject(-2, 0))
True
>>> MyObject(42, 12345) == MyObject(42, 12345)
True