[Python-Dev] copying of itertools iterators
Raymond Hettinger
raymond.hettinger at gmail.com
Fri Apr 2 01:50:08 CEST 2010
On Apr 1, 2010, at 4:20 PM, Andrew Svetlov wrote:
> using of copy.copy for simple iterators is forbidden
>
>>>> import copy
>>>> copy.copy(iter([1, 2, 3]))
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "/home/andrew/projects/py3k/Lib/copy.py", line 96, in copy
> return _reconstruct(x, rv, 0)
> File "/home/andrew/projects/py3k/Lib/copy.py", line 284, in _reconstruct
> y = callable(*args)
> File "/home/andrew/projects/py3k/Lib/copyreg.py", line 88, in __newobj__
> return cls.__new__(cls, *args)
> TypeError: object.__new__(list_iterator) is not safe, use
> list_iterator.__new__()
>
> That behavior is safe and clean.
> But it's possible to copy iterator objects returned by itertools functions:
>
>>>> i = itertools.chain([1, 2], [3, 4, 5])
>>>> i.__next__()
> 1
>>>> j = copy.copy(i)
>>>> j.__next__()
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> StopIteration
>>>> i.__next__()
> 2
>
> Looks like itertools object should be protected from usage like that.
> Folks, what are you think about?
>
I find it hard to get excited about this.
It doesn't seem to have been a problem in the real world
(no complaints, bug reports, or feature requests).
The tee() itertool is the official way to split-out an iterator
stream -- it is also copyable with copy.copy().
The itertools.count() function is also copyable.
Running copy.copy() on other itertools is currently undefined
(though I may add copy support to itertools.repeat() and
the combinatoric functions).
Also, I seems to me the copy.copy() is itself not very bright
about what it tries to copy and in giving clear messages
about whether or not it successfully made a copy.
Raymond
More information about the Python-Dev
mailing list