Найти - Пользователи
Полная версия: Можно ли скопировать итератор?
Начало » Python для новичков » Можно ли скопировать итератор?
1 2
knkd
У меня есть итератор
In [16]: import itertools
In [17]: from copy import deepcopy
In [18]: a=[0,1,2,3]
In [19]: b=[9,8,7,6]
In [20]: c=it.chain(a,b)
In [21]: d=deepcopy(c)
In [22]: id(c), id(d)
Out[22]: (140332818554768, 140332818554576)
In [23]: list(c)
Out[23]: [0, 1, 2, 3, 9, 8, 7, 6]
In [24]: list(d)
Out[24]: []
Возможно ли создать независимую копию итератора, или генератора/генераторного выражения?
Андрей Светлов
Нет, нельзя.
Более того, ваше пожелание идеологически неверное, потому что
>>> iterable = range(10)
>>> i = iter(iterable)
>>> i is iter(i)
True
Делать копию итератора - неправильно. Можно поймать очень интересные баги.
copy.copy и copy.deepcopy не выбрасывают исключение для itertools исключительно по недосмотру разработчиков.
pyuser
Андрей Светлов
Нет, нельзя.
Может просто вопрос не правильно сформулирован, судя по примеру, топикастеру нужна возможность “пройти” по итератору более одного раза, если это так, то функция tee из itertools вполне может помочь
>>> import itertools
>>> a=[0,1,2,3]
>>> b=[9,8,7,6]
>>> c, d = itertools.tee(itertools.chain(a, b))
>>> list(c)
[0, 1, 2, 3, 9, 8, 7, 6]
>>> list(d)
[0, 1, 2, 3, 9, 8, 7, 6]
Zubchick
какой вообще смысл копирования итератора? О_о'
knkd
pyuser
Может просто вопрос не правильно сформулирован, судя по примеру, топикастеру нужна возможность “пройти” по итератору более одного раза, если это так, то функция tee из itertools вполне может помочь
Дада! Именно это и хотелось.
Но itertools.tee не работает с итераторами обёрнутыми в класс.
Каким именно образом он производит клонирование? Это можно повторить самому?
Griffon
А что мешает повторно выполнить chain(a, b)? Это ведь не требует много времени. Кроме того сами списки никуда не деваются.
knkd
Griffon
А что мешает повторно выполнить chain(a, b)? Это ведь не требует много времени. Кроме того сами списки никуда не деваются.
Имеется объект, представляющий собой контейнер для цепочки итераторов.
Фактически лисапедная реализация некоторых функций итертулса.
a = xrange(1000)
b = MySuperClass(a)
b.imap(lambda x: x**2).ifilter(lambda x: x%2!=0).ienumerate()
и тд. и тп.
Нужна возможность на определённом этапе клонировать существующий итератор, чтобы если результаты окажутся неудовлетворительными то можно было продолжить с точки разветвления.
itertools.tee не подходит.
Для реализации вложенности (итератор цепочки тоже может быть цепочкой) итераторы ообёрнуты в класс.
itertools.tee копировать их в таком случае отказывается :(
Griffon
Может добавить метод __copy__?
http://www.python.org/dev/peps/pep-0323/
knkd
Griffon
Может добавить метод __copy__?
Метод всёравно должен будет копировать итератор.

Кажется я придумал решение. Буду хранить не готовые итераторы, а только ссылки на методы и передаваемые функции. А итераторы будут создаваться по требованию.
Андрей Светлов
Это - правильно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB