该代码的意图并不是很明显。当然人们会在一段时间后理解它,但代码可以更清晰。
我提供的解决方案需要更多的代码行,但该代码位于可以存储在其他地方的类中。此外,此解决方案适用于可迭代对象和迭代器以及大小容器。
您的代码将更改为:
it = HadItemsIterable(data)
for x in it:
...
if it.had_items:
...
该类的代码如下:
from collections.abc import Iterable
class HadItemsIterable(Iterable):
def __init__(self, iterable):
self._iterator = iter(iterable)
@property
def had_items(self):
try:
return self._had_items
except AttributeError as e:
raise ValueError("Not iterated over items yet")
def __iter__(self):
try:
first = next(self._iterator)
except StopIteration:
if hasattr(self, "_had_items"):
raise
self._had_items = False
raise
self._had_items = True
yield first
yield from self._iterator