优先级队列无法识别Python中的__cmp__函数

时间:2015-02-11 22:03:30

标签: python class python-3.x operator-overloading

我正在尝试在Python中实现优先级队列。我正在关注我在网上找到的exampleSkill类会覆盖__cmp__方法,以便优先级队列可以自行排序。我跑的时候收到错误:

TypeError: unorderable types: Skill() < Skill()

我在网上发现了几个例子,只要你重写__cmp__()方法,优先级队列应该是好的。

try:
    import Queue as Q  # ver. < 3.0
except ImportError:
    import queue as Q

class Skill(object):
    def __init__(self, priority, description):
        self.priority = priority
        self.description = description
        print ('New Level:', description)
        return
    def __cmp__(self, other):
        return cmp(self.priority, other.priority)

q = Q.PriorityQueue()

q.put(Skill(5, 'Proficient'))
q.put(Skill(10, 'Expert'))
q.put(Skill(1, 'Novice'))

while not q.empty():
    next_level = q.get()
    print ('Processing level:', next_level.description)

我目前在计算机上运行Python 3.4.1。

2 个答案:

答案 0 :(得分:4)

在Python3中删除了

__cmp__,您应该使用丰富的比较dunder方法__lt____le____eq____ne__,{{1} },__gt__

他们的工作如下:

__ge__

您还可以使用类装饰器functools.total_ordering,它允许您指定a < b # a.__lt__(b) a <= b # a.__le__(b) a == b # a.__eq__(b) a != b # a.__ne__(b) a > b # a.__gt__(b) a >= b # a.__ge__(b) __eq__中的任何一个,并且它将推断其余的丰富比较方法。

__lt__, __le__, __gt__, __ge__

答案 1 :(得分:1)

cmp__cmp__仅用于Python 2.x;它们不再存在于Python 3.x中。如今,您通过实施__eq____ne____lt____gt____ge____le__直接重载比较运算符。

您可以在Ordering Comparisons下的“Python 3.0新功能”页面中了解此更改:

  

cmp()函数应视为已消失,__cmp__()   不再支持特殊方法。使用__lt__()进行排序,   __eq__() __hash__() {{1}},以及其他必要的丰富比较。