遍历包含 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
函数检查队列是否为空,如果不为空,则调用 get
或 get_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
。
我是 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
函数检查队列是否为空,如果不为空,则调用 get
或 get_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
。