Я работаю над библиотекой, которая реализует структуру данных, которая работает с любым упорядоченным типом данных - диапазоном. Многие из операций (например, инверсия) становятся интересными, если учесть положительную и отрицательную бесконечность.
Одна из целей - заставить объекты datetime работать с этим модулем, и, поддерживая бесконечность с нечисловыми объектами, я создал INFINITY и NEGATIVE_INFINITY:
class _Indeterminate(object):
def __eq__(self, other):
return other is self
@functools.total_ordering
class _Infinity(_Indeterminate):
def __lt__(self, other):
return False
def __gt__(self, other):
return True
def __str__(self):
return 'inf'
__repr__ = __str__
@functools.total_ordering
class _NegativeInfinity(_Indeterminate):
def __lt__(self, other):
return True
def __gt__(self, other):
return False
def __str__(self):
return '-inf'
INFINITY = _Infinity()
NEGATIVE_INFINITY = _NegativeInfinity()
К сожалению, это не работает для объектов datetime, когда в левой части операции cmp ():
In [1]: from rangeset import *
In [2]: from datetime import datetime
In [3]: now = datetime.now()
In [4]: cmp(INFINITY, now)
Out[4]: 1
In [5]: cmp(now, INFINITY)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/axiak/Documents/rangeset/<ipython-input-5-c928d3687d92> in <module>()
----> 1 cmp(now, INFINITY)
TypeError: can't compare datetime.datetime to _Infinity
Я надеялся, что смогу обойти это ограничение, используя оболочку cmp, которая просто гарантирует, что мои объекты всегда вызываются, но я действительно хочу использовать метод .sort()
, который вызовет вызов cmp между этими объектами. 1010 *
Есть ли способ создать объект, который действительно меньше, чем любой другой объект, и действительно больше, чем любой другой объект?
Модуль home: https://github.com/axiak/py-rangeset