遍历包含python中的对象的队列

cyb*_*bel 2 python priority-queue

我是 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)
Run Code Online (Sandbox Code Playgroud)

当试图打印出它说的元素时TypeError: 'PriorityQueue' object is not iterable。我能以某种方式解决这个问题吗?我试图在这里找到一些解决方案,但我没有真正找到我理解的任何东西......

ely*_*ely 5

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

相反,您可以使用一个while循环来检查队列是否为空empty,如果不是空的,则调用getget_nowait根据需要从队列中删除和返回准备好的项目。

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

与选择这些选项之一作为默认循环行为(这可能会导致许多队列用例出现意外行为)不同,标准库实现将负担放在调用者身上,以执行某些操作,例如我提到的 while 循环,以明确描述如何“获取”队列中的每个项目。

(注意:我假设这个PriorityQueue库/实现与标准库queue模块中相同)。