Здравствуйте, Кодт, Вы писали:
К>А хотелось бы, чтоб генератор был неотличим от контейнера.
Да странно. Вообще-то это могли бы и в самом языке поддержать.
Достаточно, чтобы при вызове генераторной функции возвращался не сам итератор, а нечто с методом __iter__. (Тут можно вспомнить C#-овской разделение IEnumerable-IEnumerator).
Собственно, это можно и самому реализовать:
# -*- coding: windows-1251 -*-
class RewindableGenerator(object):
def __init__(self, func, args, kwargs):
self.func = func
self.args = args
self.kwargs = kwargs
def __iter__(self):
return self.func(*self.args, **self.kwargs)
def real_generator(func):
def wrapper(*args, **kwargs):
return RewindableGenerator(func, args, kwargs)
return wrapper
@real_generator
def foo():
yield 42
gen = foo()
print list(gen)
print list(gen)
правда, ценой введения спецдекоратора
... << RSDN@Home 1.2.0 alpha rev. 679>>