Допустим, у меня есть класс, члены которого я хочу сравнить с обычными операторами ==
, <
, <=
, >
и >=
.
Как яПонимаете, это может быть достигнуто путем инициализации определяющего магического метода __cmp__(a, b)
, который возвращает -1 (a < b
), 0 (a == b
) или 1 (a > b
).
Кажется, что __cmp__
устарел с Python 3 в пользу определения __eq__
, __lt__
, __le__
, __gt__
и _ge__
методов отдельно.
Я определил __eq__
и __lt__
при условии, что значения по умолчанию для __le__
будут выглядеть примерно так: return a == b or a < b
.Кажется, что это не так со следующим классом:
class PQItem:
def __init__(self, priority, item):
self.priority = priority
self.item = item
def __eq__(self, other):
return isinstance(other, PQItem) and self.priority == other.priority
def __lt__(self, other):
return isinstance(other, PQItem) and self.priority < other.priority
class NotComparable:
pass
x = NotComparable()
y = NotComparable()
# x < y gives error
И я получаю такой результат:
>>> PQItem(1, x) == PQItem(1, y)
True
>>> PQItem(1, x) < PQItem(1, y)
False
>>> PQItem(1, x) <= PQItem(1, y)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: PQItem() <= PQItem()
Это заставило меня заключить, что мне придется определить всеметоды магии сравнения вручную, чтобы сделать класс сопоставимым.Есть ли лучший способ?
Почему __cmp__
устарела?Похоже, гораздо приятнее справиться с этим