我正在尝试使用queue.PriorityQueue
在 Python 3(.6) 中。
我想存储具有给定优先级的对象。但如果两个对象具有相同的优先级,我不介意PriorityQueue.get
返回任一。换句话说,我的对象不能在整数上进行比较,允许它们进行比较是没有意义的,我只关心优先级。
In 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)
唉,我用的是Python 3.6。在该版本Python的文档,没有评论使用PriorityQueue
对于优先级,不关心“对象价值”,这在我的情况下是不合逻辑的。
有没有比定义更好的方法__le__
以及我的自定义类上的其他比较方法?我发现这个解决方案特别丑陋且违反直觉,但这可能就是我。
dataclasses
只是一种避免创建大量样板代码的便捷方法。
你实际上并不have创建一个类。也具有唯一计数器值的元组:
from itertools import count
unique = count()
q.put((priority, next(unique), item))
以便同等优先级之间的联系被后面的整数打破;因为它总是独一无二的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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)