我有一个 Receiver 对象,它有时会累积一个数据包队列,这些数据包将在处理时被消耗。让这个接收器有一个迭代器协议似乎是合理的,因此next( receiver )
将手动检索下一个数据包,并for packet in receiver
遍历当前可用的数据包。直观地说,进行一次这样的迭代就可以了,遍历所有可用的数据包,直到接收器for
通过引发来停止循环StopIteration
(这是迭代器告诉for
循环该停止的标准方式),然后再使用这样的for
再次循环以检查在此期间到达的任何新数据包。
但是,Python文档说:
一旦迭代器的
__next__()
方法 raiseStopIteration
,它必须在后续调用中继续这样做。不遵守此属性的实现被视为已损坏。
据我所知,即使这段代码被认为是“被认为损坏了”,它也可以正常工作。所以我想知道拥有看似工作正常的代码对我来说有多糟糕,并且以一种直观的方式期望迭代器能够工作,但不知何故“被认为是坏的”?在你提出后,返回更多物品有什么问题StopIteration
吗?有什么理由我应该改变这个吗?
(我认识到我可以使接收器成为一个可迭代的(其__iter__
方法会产生一些其他迭代器)而不是迭代器本身(使用它自己的__next__
方法),但是(a)这不支持熟悉的直观使用next( receiver )
将下一个数据包从队列中弹出,并且(b)当我已经有一个非常好的类似迭代器的对象时,重复生成新的迭代器对象似乎既浪费又低效,其唯一的错误是它显然“被认为已损坏”,并且( c) 将接收器呈现为一种可迭代容器会产生误导,因为接收器在检索数据包时会消耗数据包(我正在为其制作 Python 包装器的 C 库中内置的行为,我不认为我也开始在 Python 中缓存它们是有意义的),所以如果有人试图让多个迭代器以他们自己的节奏遍历接收者的队列,迭代器会互相窃取项目并产生比我将其呈现为单个停走迭代器所产生的任何结果更加令人困惑的结果而不是作为一个可迭代的容器。)