順序付けられたデータ型(範囲セット)で機能するデータ構造を実装するライブラリに取り組んでいます。正と負の無限大を考慮に入れると、多くの操作(反転など)が面白くなります。
1つの目標は、日時オブジェクトをこのモジュールで動作させることです。数値以外のオブジェクトで無限大をサポートするために、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()
残念ながら、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が呼び出されるようにするメソッドを実際に使用したいと思います。
他のどのオブジェクトよりも本当に小さく、他のどのオブジェクトよりも本当に大きいオブジェクトを作成する方法はありますか?