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: '&lt;' 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