Все, что вам нужно сделать, чтобы убедиться, что генератор пуст, это попытаться получить следующий результат. Конечно, если вы не готовы использовать этот результат, вам нужно сохранить его, чтобы потом вернуть его снова.
Вот класс-оболочка, который можно добавить к существующему итератору для добавления теста __nonzero__
, чтобы вы могли увидеть, пустой ли генератор, с помощью простого if
. Возможно, его также можно превратить в декоратор.
class GenWrapper:
def __init__(self, iter):
self.source = iter
self.stored = False
def __iter__(self):
return self
def __nonzero__(self):
if self.stored:
return True
try:
self.value = next(self.source)
self.stored = True
except StopIteration:
return False
return True
def __next__(self): # use "next" (without underscores) for Python 2.x
if self.stored:
self.stored = False
return self.value
return next(self.source)
Вот как бы вы его использовали:
with open(filename, 'r') as f:
f = GenWrapper(f)
if f:
print 'Not empty'
else:
print 'Empty'
Обратите внимание, что вы можете проверить пустоту в любое время, а не только в начале итерации.