heapq推送比较如何在2.7 vs 3.x中工作

时间:2015-03-11 19:33:59

标签: python python-2.7 python-3.x heap

import heapq

class Foo(object):
    def __init__(self, x):
        self._x = x

l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))

这适用于Python 2.7,但不适用于3.x.如文档中所述

  

将来使用Python 3时,如果优先级相等且任务没有默认比较顺序,则(优先级,任务)对的元组比较会中断。

2.7' heapq.heappush

中如何处理不可比较的对象?

1 个答案:

答案 0 :(得分:2)

让我们假设您希望通过其._x值来比较Foo实例。您的代码可能在2.x中运行,但它不会以任何明智的方式工作,因为Foo instancex将通过其ID进行比较。 Python 3通过没有无用的默认值来保护您免受此类静默错误的影响。 heapq至少使用<。以下在3.x中运行并且在2.x和3.x中正常工作,至少对于此示例。

import heapq

class Foo(object):
    def __init__(self, x):
        self._x = x
    def __repr__(self):
        return 'Foo(%s)' % self._x
    def __lt__(self, other):
        return self._x < other._x

l = [Foo(1)]
heapq.heapify(l)
heapq.heappush(l, Foo(2))
print(l)

根据需要或需要添加其他丰富的比较方法。您可以在每个if isinstance(other, Foo) else NotImplemented表达式的末尾添加return,以便与非Foo实例进行比较,效果更好。