heapq
использует внутренние сравнения элементов очереди (__le__
и друзей). Общий способ обойти это ограничение - это старый добрый подход, известный как «decorate / undecorate» - это то, что мы делали при сортировке до того, как там был введен параметр key=
.
Проще говоря, вы ставите в очередь и удаляете из очереди не только элементы, которые вас интересуют («полезная нагрузка»), но скорее элементы, «декорированные» в кортежи, которые начинаются с «ключей», которые необходимо учитывать heapq
Так, например, было бы нормально поставить в очередь кортеж типа (foo.x, time.time(), foo)
, если вы хотите установить приоритеты с помощью атрибута x
со связями, разорванными во время вставки в очередь - конечно, когда вы удаляете из очереди "undecorate", взяв [-1]
элемент кортежа, который вы получите, выкинув очередь.
Итак, просто вставьте «второстепенные ключи», которые вы должны рассматривать как «разрывающие связи», в «украшенный» кортеж, который вы ставите в очередь, ПОСЛЕ тех, чьи «связи» вы хотите разорвать таким образом.