遍历包含 python 中对象的队列

Iterate through queue containing objects in python

我是 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。我能以某种方式解决这个问题吗?我试图在这里找到一些解决方案,但我并没有真正找到我理解的任何东西......

PriorityQueue 不支持使 for 循环语法适用于数据结构的内部函数(例如 __iter__next)。

相反,您可以使用 while 循环使用 empty 函数检查队列是否为空,如果不为空,则调用 getget_nowait根据需要从队列中删除和 return 项目,因为它们准备就绪。

因为需要调用方的特殊知识才能知道从队列中消费下一项的含义,所以支持for循环迭代会很不方便。 for 循环会为队列做什么?总是假设它应该在成功消耗当前项目后立即消耗 get_nowait ?然后如果队列没有任何项目立即准备好 return,它可能会抛出异常。它是否应该始终使用 get 并永远阻塞等待每个项目?然后 for-loop 语法将掩盖可能的复杂性,永远等待。

标准库实现不是选择这些选项之一作为默认循环行为,这可能会导致许多队列用例出现意外行为,而是让调用者承担做某事的负担,例如 while 循环我提到过,要明确描述如何 "get" 队列中的每个项目。

(注意:我假设这个 PriorityQueue 库/实现是 same as from the standard library queue module)。

你可以

for elem in frontier.queue:
        print(elem)

当然这会破坏信息隐藏,我检查了实现代码以了解这一点,但也许出于这样的原因,该属性被命名为 self.queue 而不是 self._queue