Re: [Python] Можно ли клонировать или перезапускать генерато
От: eugals Россия  
Дата: 26.08.07 19:40
Оценка: 88 (2)
Здравствуйте, Кодт, Вы писали:

К>А хотелось бы, чтоб генератор был неотличим от контейнера.

Да странно. Вообще-то это могли бы и в самом языке поддержать.
Достаточно, чтобы при вызове генераторной функции возвращался не сам итератор, а нечто с методом __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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.