我是python的新手,在尝试迭代队列时发现了一个奇怪的错误。
以下是代码段:
frontier = q.PriorityQueue()
for goal in goals:
portals = findPortals(maze)
comb_value = heuristic(startX, startY, goal[0], goal[1])
frontier.put_nowait((comb_value, heuristic(startX, startY, goal[0], goal[1]), 0, startX, startY, startX, startY))
for portal in portals:
heur = portalHeuristic(maze, startX, startY, goal[0], goal[1])
frontier.put_nowait((heur, heur, 0, startX, startY, startX, startY))
for elem in list(frontier):
print(elem)
在尝试打印出TypeError: 'PriorityQueue' object is not iterable
元素时。我能以某种方式修复此问题吗?我试着在这里找到一些解决方案,但我并没有找到任何我理解的东西......
答案 0 :(得分:4)
a = [[n] for n in range(v.shape[0])]
# which looks like
# [[0],[1],[2],[3]...]
# since we are trying to indicate the row indices of the matrix v as opposed to
# [0, 1, 2, 3, ...] which refers to column indices
不支持使for循环语法适用于数据结构的内部函数(例如PriorityQueue
和__iter__
)。
相反,您可以使用next
循环来检查Queue在while
函数中是否为空,如果不为空,则根据需要调用empty
或get
在准备就绪时从队列中删除和返回项目。
因为它需要调用者方面的特殊知识才能知道从队列中消耗下一个项目的意义,所以支持循环迭代会很不方便。 for循环对队列有什么作用?在成功使用当前项目后,总是假设它应该立即消耗get_nowait
?然后,如果队列没有任何项目立即准备好返回,它可能会抛出异常。它应该始终使用get_nowait
并永久阻止等待每个项目吗?然后for循环语法将掩盖可能的并发症,永远等待。
而不是选择其中一个选项作为默认循环行为,这可能导致许多队列用例的意外行为,标准库实现会给调用者带来负担,比如我提到的while循环,明确描述如何“获取”队列中的每个项目。
(注意:我假设这个get
库/实现是same as from the standard library queue
module。)
答案 1 :(得分:0)
你可以
for elem in frontier.queue:
print(elem)
当然这打破了信息隐藏,我检查了实现代码以查看,但是由于这样的原因,atribute可能被命名为self.queue
而不是self._queue
。