检查python中的对象是否可以订购?

ree*_*eem 7 python types typechecking

如何在Python中检查对象是否可订购/可排序?

我正在尝试为__init__我的二叉树类的方法实现基本类型检查,我希望能够检查节点的值是否可订购,如果不是则抛出错误.它类似于在哈希表的实现中检查哈希性.

我正在尝试完成类似于Haskell的(Ord a) => etc.限定符.在Python中有类似的检查吗?

abr*_*hes 5

如果要知道对象是否可排序,则必须检查它是否实现了必要的比较方法.

Python 2.X中,有两种不同的方法来实现这些方法:

  1. cmp方法(相当于每个例子中的compareTo in Java)

    __cmp__(self, other):返回> 0,0或<0更自我更多,等于或小于其他

  2. 丰富的比较方法

    __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中的可排序对象:

PS:这是对我的第一个答案的完全重新编辑,但它需要,因为我更好地调查了问题,并对它有一个更清晰的想法:)