Calvin Spealman wrote:
On 12/24/06, Talin
wrote: Mathias Panzenböck
wrote: Copyable iterators ------------------
There are a few ways how you could implement this. However, it only makes sense for iterators, not for generators! -1 on the entire proposal. All iterators (and generators) are already copyable. It's called list(). Actually, what he wants to be able to do is to 'tee' an iterator. However, we already have a 'tee' function in itertools that does just
Josiah Carlson wrote: that. (And it works on generators too!)
-- Talin
If I am understanding the proposal correctly, which I think I am, itertools.tee is not the same as what this is proposing. itertools.tee simply iterates the original and caches the results to be given when iterating over the two tees created for it. This is not the same as copying an iterator. Copying an iterator would create a new iterator of the same state as the original. For example, with generators the copy would be a new generator object with the same state as the original and iterating over the copy would execute the same code as the first.
def g(): i = 0 while True: print i yield i i = i + 1
If you "copy" this with itertools.tee, you only see i printed once for each iteration of the generator, not each iteration of the tees. With a real copying of iterators, if I copied this, iterating over the copies would always produce an output of that copies value of i.
The OP already stated that the proposal is not meant to apply to generators, and rightly so, because there's no way to copy all of the mutable state that a generator might access. However, I think that the idea of copying 'iterators but not generators' is too restrictive, since externally you might not be able to tell the difference. That's why I suggested tee, since it works on both. No, you don't get the same side effects, but that's not what the OP was asking for. -- Talin