В Python3 шесть операторов расширенного сравнения
__lt__(self, other)
__le__(self, other)
__eq__(self, other)
__ne__(self, other)
__gt__(self, other)
__ge__(self, other)
должны предоставляться индивидуально.Это может быть сокращено с помощью functools.total_ordering
.
Однако в большинстве случаев это оказывается довольно нечитабельным и непрактичным.Тем не менее, вы должны поместить подобные куски кода в 2 функции - или использовать еще одну вспомогательную функцию.
Так что в основном я предпочитаю использовать класс mixin PY3__cmp__
, показанный ниже.Это восстанавливает единую структуру __cmp__
метода, которая была и остается достаточно ясной и практичной в большинстве случаев.Можно по-прежнему переопределять выбранные расширенные сравнения.
Ваш пример будет просто:
class point(PY3__cmp__):
...
# unchanged code
Класс mixin PY3__cmp__:
PY3 = sys.version_info[0] >= 3
if PY3:
def cmp(a, b):
return (a > b) - (a < b)
# mixin class for Python3 supporting __cmp__
class PY3__cmp__:
def __eq__(self, other):
return self.__cmp__(other) == 0
def __ne__(self, other):
return self.__cmp__(other) != 0
def __gt__(self, other):
return self.__cmp__(other) > 0
def __lt__(self, other):
return self.__cmp__(other) < 0
def __ge__(self, other):
return self.__cmp__(other) >= 0
def __le__(self, other):
return self.__cmp__(other) <= 0
else:
class PY3__cmp__:
pass