heapq
будет использовать оператор <=
для любого материала, который вы в него вставляете.
Кортежи сравниваются позиция за позицией: первый элемент первого кортежа сравнивается с первым элементом второгокортеж;если они не равны (т. е. первый больше или меньше второго), то это результат сравнения, в противном случае рассматривается второй элемент, затем третий и т. д.
Если первый элементкаждый кортеж уникален, сравнение всегда происходит только по первому элементу:
>>> x = (1, object())
>>> y = (2, object())
>>> x <= y
True
(примечание: я использовал object()
для создания анонимного объекта, который не реализует операторы сравнения)
Проблема возникает, когда первый элемент кортежа не является уникальным (т. Е. Первый элемент кортежа будет равен для некоторой пары кортежей), тогда для сравнения придется сравнить второй элемент кортежа:
>>> z = (1, object())
>>> x <= z
Traceback (most recent call last):
File "<input>", line 1, in <module>
x <= z
TypeError: '<=' not supported between instances of 'object' and 'object'
Таким образом, либо вы реализуете операторы сравнения в своем объекте, либо убедитесь, что предыдущие элементы в кортеже всегда сопоставимы и вместе уникальны.
Например, вы можете добавить идентификатор объекта в кортеж, так что ваши кортежи становятся:
(priority, id(obj), obj)
, поскольку идентификатор объекта уникален.(будьте осторожны: вы снова столкнетесь с этой проблемой, если добавите два экземпляра одного и того же объекта с одинаковым приоритетом).