[Python-ideas] Generators are iterators

Chris Barker chris.barker at noaa.gov
Sat Dec 13 01:40:14 CET 2014

On Fri, Dec 12, 2014 at 3:22 PM, Andrew Barnert <abarnert at yahoo.com> wrote:
> 1) It's not clear what is meant by an "iterator" -- when we use the term
> is seems like we are talking about a type, when we are really talking about
> "anything that conforms to the iterator protocol", so I'm going to
> introduce a new term: TIIP (Type Implementing the Iterator Protocol) --
> maybe that's too cute, but role with it for now.
> When you're writing actual code, you can test this with
> isinstance(collections.abc.Iterator). Of course ABCs don't _perfectly_
> cover their related protocols (in this case, if you create a type that has
> __iter__ and __next__ but __iter__ doesn't return self--or, of course, if
> you just register some random type with Iterator explicitly--you've created
> a subclass of Iterator that isn't a subtype of the iterator protocol). But
> I think it still makes sense to use Iterator as shorthand for "type that
> subclasses Iterator" with the implied "is an actual subtype of the semantic
> type intended by the Iterator class".

this issue here is that inteh PEP, and in this list, it seems "iterator"
was used to describe classes with __init__ and __next__ methods, AS APPOSED
to the things returned from functions with a yield in them...


In [12]: g = (i for i in range(10))

In [13]: isinstance(it, collections.abc.Iterator)
Out[13]: True


In [15]: def gf():
   ....:     yield 1
   ....:     yield 2

In [16]: gen = gf()

In [17]: isinstance(gen, collections.abc.Iterator)
Out[17]: True

So generators ARE iterators, but his definition and yet the contrast was
being made....

> This kind of shorthand is used regularly in discussing types in every OO
> language, not just Python.

sure, but Python is dynamically types, so "conforms to a protocol" not at
all teh same is "isinstance", even though ABCS have made this closer...

> In Python, the term "Iterator" is just as consistent and meaningful as in
> all these other languages. The fact that some people confuse iterables and
> iterators isn't a reason to abandon this simplicity.

actually, the confusion between iterables and iterators want the issue I as
trying to address -- but the confusion with a sentence like

"Under this proposal, generators and iterators would be distinct, but related,

That has been removed from the PEP -- I think it's more clean now in any

But yes, I could have written all that and stuck with plain old "iterator"
instead of making up "TIIP"

Especially since it doesn't even help to solve the problem--as we've just
> seen in this very message I'm replying to, it's just as easy for someone to
> mistakenly use TIIP to describe "range" as it is for them to mistakenly use
> "Iterator".

My bad -- typing too fast! And this was never about the itterable vs
iterator distinction anyway.

> (In fact, it's arguably worse, because what would you call an Iterable
> under the same naming scheme but Type Implementing Iterable Protocol, or
> TIIP?)

I was not trying to mingle iterable and iterator -- really I wan't :-)

> The things we need to be clear about here are the things that _dont't_
> have an official name. In particular, the thing that's built from calling a
> generator function or evaluating a generator expression and used by the
> generator.

now I am confused:

In [18]: g = ( i for i in range(10) )

In [19]: type(g)
Out[19]: generator

how is that not a "generator"?



Christopher Barker, Ph.D.

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker at noaa.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20141212/db2cb141/attachment-0001.html>

More information about the Python-ideas mailing list