См. примечания к реализации приоритетной очереди - непосредственно перед цитируемым разделом (касающимся использования dataclasses
) в нем рассказывается, как это сделать без их:
... - для сохранения записей в виде списка из 3 элементов, включая приоритет, количество записей и задачу.Счетчик записей служит для разрешения конфликтов, поэтому две задачи с одинаковым приоритетом возвращаются в порядке их добавления.И поскольку нет двух одинаковых счетчиков записей, сравнение кортежей никогда не будет пытаться напрямую сравнить две задачи.
Поэтому просто добавьте свои элементы как 3-й элемент в кортеж (Prio, Count, YourElem)
при добавлении в вашу очередь.
Приведенный пример:
from queue import PriorityQueue
class CompareError(ValueError): pass
class O:
def __init__(self,n):
self.n = n
def __lq__(self):
raise CompareError
def __repr__(self): return str(self)
def __str__(self): return self.n
def add(prioqueue,prio,item):
"""Adds the 'item' with 'prio' to the 'priorqueue' adding a unique value that
is stored as member of this method 'add.n' which is incremented on each usage."""
prioqueue.put( (prio, add.n, item))
add.n += 1
# no len() on PrioQueue - we ensure our unique integer via method-param
# if you forget to declare this, you get an AttributeError
add.n = 0
h = PriorityQueue()
add(h, 7, O('release product'))
add(h, 1, O('write spec 3'))
add(h, 1, O('write spec 2'))
add(h, 1, O('write spec 1'))
add(h, 3, O('create tests'))
for _ in range(4):
item = h.get()
print(item)
Использование h.put( (1, O('write spec 1')) )
приводит к
TypeError: '<' not supported between instances of 'O' and 'int'`
Использование def add(prioqueue,prio,item):
выдвигает триплеты как элементы, которые гарантированно имеют отличные 2-е значения, поэтому наши O()
-инстанции никогда не используются в качестве прерывателя связей.
Вывод:
(1, 2, write spec 3)
(1, 3, write spec 2)
(1, 4, write spec 1)
(3, 5, create tests)
см. MartijnPieters ответ @ здесь длялучший уникальный 2-й элемент.