TypeError:'State'和'State' PYTHON 3的实例之间不支持'<'
Posted
技术标签:
【中文标题】TypeError:\'State\'和\'State\' PYTHON 3的实例之间不支持\'<\'【英文标题】:TypeError: '<' not supported between instances of 'State' and 'State' PYTHON 3TypeError:'State'和'State' PYTHON 3的实例之间不支持'<' 【发布时间】:2017-04-18 20:00:36 【问题描述】:我正在尝试使用队列类中的 PriorityQueue。但是,我在将自定义对象放入我的 PQ 时遇到问题。我在下面实现了__cmp__
函数:
def __cmp__(self, other):
return (self.priority > other.priority) - (self.priority < other.priority)
我希望按照我的 init 函数中分配的优先级字段对 PriorityQueue 进行排序:
def __init__(self, board, priority=0):
self.priority = priority
# Other logic
但是,当我运行代码将 State 对象插入 PQ 时,我收到此错误:TypeError: '<' not supported between instances of 'State' and 'State'
这是运行 PQ 的代码。
if op.precond(S):
new_state = op.state_transf(S)
if not (OPEN.queue.__contains__(new_state)) and not (new_state in CLOSED):
GVALUES[Problem.hash(new_state)] = get_distance_value(op, new_state)
HEUR_VALUES[Problem.hash(new_state)] = get_AStar_value(new_state)
print("NEW STATE: " + str(new_state))
OPEN.put(new_state)
print("OPEN: " + str(OPEN.queue))
其中 OPEN 是优先队列。
任何帮助将不胜感激...因为将值插入 PQ 应该非常简单。
【问题讨论】:
__cmp__
在 Python 3 中并不是一个特殊的方法名称。尝试定义 __lt__
,看看是否可行。
【参考方案1】:
在 Python 3 中,您需要定义 __lt__
和 __eq__
而不是 __cmp__
。
见https://docs.python.org/3.1/library/stdtypes.html#comparisons。
【讨论】:
【参考方案2】:您需要实现__lt__
、__le__
、__gt__
或__ge__
方法之一,而不是__cmp__
,并使用functools.total_ordering
装饰器
functools.total_ordering(cls)
给定一个定义一个或多个富 比较排序方法,这个类装饰器提供其余部分。 这简化了指定所有可能的 丰富的比较操作:该类必须定义
__lt__()
、__le__()
、__gt__()
或__ge__()
。此外,该类应提供一个__eq__()
方法。
但是,更好的解决方案是将元组 (priority, state_object)
放入队列中,正如他们在 PriorityQueue
的文档中所建议的那样
首先检索最低值的条目(最低值的条目 是
sorted(list(entries))[0])
返回的那个。典型模式 条目是一个元组,格式为:(priority_number, data)
。
第一种方法的缺陷是您可以修改已在队列中的项目的优先级,并可能观察到意外行为。
在第二种方法中,这不是问题,因为元组是不可变的。
【讨论】:
以上是关于TypeError:'State'和'State' PYTHON 3的实例之间不支持'<'的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:null 不是对象(评估 ''this.state.torchon')
TypeError:null 不是对象(评估'this.state.initialPosition') - React Native
TypeError:state.userInfo 在 Jest 测试中不可迭代
TypeError:this.state.persons.map 不是函数
TypeError:this.state.patients.map 不是函数
反应本机获取多标记[未处理的承诺拒绝:TypeError:TypeError:未定义不是对象(评估'this.state.markers.map