Я создаю генератор, который потребляется другой функцией, но я все еще хотел бы знать, сколько элементов было сгенерировано:
lines = (line.rstrip('\n') for line in sys.stdin)
process(lines)
print("Processed {} lines.".format( ? ))
Лучшее, что я могу придумать, - это обернуть генератор классом, который ведет счет, или, может быть, вывернуть его наизнанку и отправить () вещи. Существует ли элегантный и эффективный способ узнать, сколько предметов у генератора производится, когда вы не тот, кто потребляет его в Python 2?
Редактировать: Вот что я закончил:
class Count(Iterable):
"""Wrap an iterable (typically a generator) and provide a ``count``
field counting the number of items.
Accessing the ``count`` field before iteration is finished will
invalidate the count.
"""
def __init__(self, iterable):
self._iterable = iterable
self._counter = itertools.count()
def __iter__(self):
return itertools.imap(operator.itemgetter(0), itertools.izip(self._iterable, self._counter))
@property
def count(self):
self._counter = itertools.repeat(self._counter.next())
return self._counter.next()