Iterator / Iteratable confusion

Adam DePrince adam at cognitcorp.com
Tue Feb 15 19:54:02 EST 2005


On Tue, 2005-02-15 at 19:25, Terry Reedy wrote:
> "Michael Spencer" <mahs at telcopartners.com> wrote in message 
> news:cuthdk$dnq$1 at sea.gmane.org...
> 
> > Terry, thanks for responding in depth.
> We are both interested in the murky edges at and beyond conventional usage.
> > Terry wrote
> >> 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.
> What I was pointing to as wasteful is the application of your alternative 
> behavior where an object is replaced by a copy and then effectively tossed.
> > However, I suggest that there may be cases where
> > "iter(iterator) is not iterator" is useful behavior.
> I am quite aware that multiple iterators for the same iterable (actual or 
> conceptual) can be useful (cross products, for example).  But I am dubious 
> that initialized clones of 'iterators' are *more* useful, especially for 
> Python, than multiple iterators derived from repeated calling of the 
> callable that produced the first iterator.  It might be different if Python 
> were a prototype/clone language rather than a typeclass/instance language. 
> It is also possible that we have slightly different ideas of 'useful' in 
> the Python context.
> In your example, as I pointed out, A.__iter__ and AnIterator.__iter__ have 
> the same code, so I could not see any advantage to getting a copy through 
> calling the latter instead of the former.  For the disadvantage, see below.
> >  What to call such an object is another matter.
> spencerator ;-?
> Here are some related reasons why I think it useful if not essential to 
> restrict the notion of iterator by restricting  iterator.__iter__ to 
> returning self unmodified.
> Leaving Python aside, one can think of iterable as something that 
> represents a collection and that can produce an iterator that produces the 
> items of the collection one at a time.  In this general conceptioning, 
> iterables and iterators seem distinct (if one ignores self-iterables).  In 
> Python, giving iterators an __iter__ method, while quite useful, erases 
> (confuses) the (seeming) distinction, but giving them a minimal __iter__ 
> does so minimally, keeping iterators a distinct subcategory of iterable. 
> Spencerators confuse the distinction more than minimally and define a 
> vaguer subcategory.
> Essential?  For something defined as minimal, it is essential that it be 
> minimal.  But you point seems to be that it is not essential that iterator 
> be so defined.  Ok.
> (Aside: an iterator can be thought of as representing the sequence of 
> future .next() returns.  From this viewpoint, making iterators a 
> subcategory of iterable is more than just a convenience.)
> Taking Python as it is, a useful subcategory of iterable is 'reiterable'. 
> This is distinct from iterator strictly defined.  This we have iterables 
> divided into iterators, reiterables, and other.  I think this is 
> didactically useful.  Spencerators are reiterables.
> Iter(iterator) returning iterator unchanged makes iterator a fixed point of 
> iter.  It ends any chain of objects returned by repeated iter calls. 
> Spencerators prolong any iter chain, making it infinite instead of finite. 
> Essential?  Repeat the paragraph above with 'a fixed point' substituted for 
> 'minimal'.

How is spencerator different than itertools.tee?


Adam DePrince 





More information about the Python-list mailing list