使用 queue.PriorityQueue,不关心比较

vin*_*-lg 2 python priority-queue python-dataclasses

我正在尝试queue.PriorityQueue在 Python 3(.6) 中使用。

我想存储具有给定优先级的对象。但是如果两个对象具有相同的优先级,我也不介意PriorityQueue.get返回。换句话说,我的对象不能以整数进行比较,允许它们是没有意义的,我只关心优先级。

Python 3.7 的文档中,有一个涉及dataclasses. 我引用:

如果数据元素不可比较,可以将数据包装在一个忽略数据项而只比较优先级数字的类中:

from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
Run Code Online (Sandbox Code Playgroud)

唉,我使用的是 Python 3.6。在这个版本的 Python 的文档中,没有关于使用PriorityQueue优先级的评论,也不关心在我的情况下不合逻辑的“对象值”。

有没有比__le__在我的自定义类上定义和其他比较方法更好的方法?我发现这个解决方案特别丑陋和违反直觉,但这可能是我。

Mar*_*ers 5

dataclasses 只是一种避免必须创建大量样板代码的便捷方法。

您实际上不必创建类。一个具有唯一计数器值的元组:

from itertools import count

unique = count()

q.put((priority, next(unique), item))
Run Code Online (Sandbox Code Playgroud)

以便相等优先级之间的联系被后面的整数打破;因为它始终是唯一的,item所以从不咨询该值。

您还可以使用直接丰富的比较方法创建一个类,使用以下方法变得更简单@functools.total_ordering

from functools import total_ordering

@total_ordering
class PrioritizedItem:
    def __init__(self, priority, item):
        self.priority = priority
        self.item = item

    def __eq__(self, other):
        if not isinstance(other, __class__):
            return NotImplemented
        return self.priority == other.priority

    def __lt__(self, other):
        if not isinstance(other, __class__):
            return NotImplemented
        return self.priority < other.priority
Run Code Online (Sandbox Code Playgroud)