iterators: class vs generator

Michael Hudson mwh at python.net
Wed Aug 25 07:24:41 EDT 2004


"Clark C. Evans" <cce at clarkevans.com> writes:

> There is an interesting difference between how exceptions are handled
> between iterators constructed from a class, and iterators constructed
> from a generator.  The following are "mostly equivalent":

[...]

> However, when exceptions are involved, behavior can be different:

(It would have been nice if you'd explained what the differences were
in your post, and given that you'd didn't if you'd made sure the
examples were correct -- got a NameError for iterable...)

Here's a better illustration:

>>> def iterable_via_generator():
...     yield "one"
...     raise Exception()
...     yield "two"
... 
>>> i = iterable_via_generator()
>>> i.next()
'one'
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 3, in iterable_via_generator
Exception
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration

I agree this is surprising.  I am vaguely aware of some effort being
put in to make generators "stick", i.e. this doesn't surprise me so
much:

>>> def g():
...     yield 1
...     return
...     yield 2
... 
>>> i = g()
>>> i.next()
1
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration
>>> i.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
StopIteration

I'd guess the behaviour you've noticed is an unintended consequence of
this.  I'd also be willing to be persuaded that it's a bug, although
others might disagree, dunno.  File an issue, anyway?

Cheers,
mwh

-- 
  I would hereby duly point you at the website for the current pedal
  powered submarine world underwater speed record, except I've lost
  the URL.                                         -- Callas, cam.misc



More information about the Python-list mailing list