Michael Spencer wrote:
But, notwithstanding the docs, it is not essential that
iter(iterator) is iterator

Terry Reedy wrote: > iter(iterator) is iterator is part of the iterater protocol >
[...]I interpret [your post] as saying three things:

1. "There is more than one possible definition of 'iterator'."

Terry, thanks for responding in depth.


2. "It is not essential to not do something wasteful as long as it is otherwise inconsequential."

Not that "iter(iterator) is iterator" is somehow wasteful (actually it seems
conservative), but rather that alternative behavior is readily implmented. You point out, reasonably, that if I do that, then what I get is not then an iterator, because it fails to conform with the protocol.


However, I suggest that there may be cases where "iter(iterator) is not iterator" is useful behavior. What to call such an object is another matter.

For example, consider:

import itertools as it
def tee2(iterable):
    class itertee(object):
        def __init__(self, iterator):
            self.iterator = iterator
        def __iter__(self):
            return itertee(self.iterator.__copy__())
        def next(self):
            return self.iterator.next()
    return itertee(it.tee(iterable, 1)[0])

This returns an itertee instance which simply wraps the tee iterator returned by itertools. However iter(itertee instance) returns a copy of its iterator. So this object creates as many independent iterators over iterable as are required.

In an earlier post in this thread, I included several examples of generating infinite series using iterator-copying like this. I implemented the copying as a method of a containing iterable 'Stream', rather than of the iterators themselves, partly to respect the 'iterator protocol'.


3. "You can substitute a copy of an object that is never mutated for the object itself."

This was not my intended point, although I accept that my example was too 
abstract.

Cheers

Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to