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
?
答案 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实例进行比较,效果更好。