ree*_*eem 7 python types typechecking
如何在Python中检查对象是否可订购/可排序?
我正在尝试为__init__
我的二叉树类的方法实现基本类型检查,我希望能够检查节点的值是否可订购,如果不是则抛出错误.它类似于在哈希表的实现中检查哈希性.
我正在尝试完成类似于Haskell的(Ord a) => etc.
限定符.在Python中有类似的检查吗?
如果要知道对象是否可排序,则必须检查它是否实现了必要的比较方法.
在Python 2.X中,有两种不同的方法来实现这些方法:
cmp方法(相当于每个例子中的compareTo in Java)
__cmp__(self, other)
:返回> 0,0或<0更自我更多,等于或小于其他
丰富的比较方法
__lt__, __gt__, __eq__, __le__, __ge__, __ne__
sort()函数调用此方法在实例之间进行必要的比较(实际排序只需要__lt__
或__gt__
方法,但建议实现所有这些)
在Python中3.X的__cmp__
是有利于丰富的比较方法去除,不必做同样的事情,实在是对Python的"法律"的方法不止一种.
所以,你基本上需要一个函数来检查这些方法是否由类实现:
# Python 2.X
def is_sortable(obj):
return hasattr(obj, "__cmp__") or \
hasattr(obj, "__lt__") or \
hasattr(obj, "__gt__")
# Python 3.X
def is_sortable(obj):
cls = obj.__class__
return cls.__lt__ != object.__lt__ or \
cls.__gt__ != object.__gt__
Run Code Online (Sandbox Code Playgroud)
Python 2和3需要不同的函数,因为许多其他的东西也会改变Python 3中的未绑定方法,方法包装器和其他内部事物.
阅读此链接,您希望更好地理解Python中的可排序对象:
http://python3porting.com/problems.html#unorderable-types-cmp-and-cmp
http://docs.python.org/2/howto/sorting.html#the-old-way-using-the-cmp-parameter
PS:这是对我的第一个答案的完全重新编辑,但它需要,因为我更好地调查了问题,并对它有一个更清晰的想法:)