[Python-Dev] Re: anonymous blocks
Tim Delaney
tcdelaney at optusnet.com.au
Thu Apr 28 00:34:59 CEST 2005
Guido van Rossum wrote:
> - temporarily sidestepping the syntax by proposing 'block' instead of
> 'with'
> - __next__() argument simplified to StopIteration or
> ContinueIteration instance
> - use "continue EXPR" to pass a value to the generator
> - generator exception handling explained
+1
A minor sticking point - I don't like that the generator has to re-raise any
``StopIteration`` passed in. Would it be possible to have the semantics be:
If a generator is resumed with ``StopIteration``, the exception is
raised
at the resumption point (and stored for later use). When the generator
exits normally (i.e. ``return`` or falls off the end) it re-raises the
stored exception (if any) or raises a new ``StopIteration`` exception.
So a generator would become effectively::
try:
stopexc = None
exc = None
BLOCK1
finally:
if exc is not None:
raise exc
if stopexc is not None:
raise stopexc
raise StopIteration
where within BLOCK1:
``raise <exception>`` is equivalent to::
exc = <exception>
return
The start of an ``except`` clause sets ``exc`` to None (if the clause is
executed of course).
Calling ``__next__(exception)`` with ``StopIteration`` is equivalent
to::
stopexc = exception
(raise exception at resumption point)
Calling ``__next__(exception)`` with ``ContinueIteration`` is equivalent
to::
(resume exception with exception.value)
Calling ``__next__(exception)__`` with any other value just raises that
value
at the resumption point - this allows for calling with arbitrary
exceptions.
Also, within a for-loop or block-statement, we could have ``raise
<exception>`` be equivalent to::
arg = <exception>
continue
This also takes care of Brett's concern about distinguishing between
exceptions and values passed to the generator. Anything except StopIteration
or ContinueIteration will be presumed to be an exception and will be raised.
Anything passed via ContinueIteration is a value.
Tim Delaney
More information about the Python-Dev
mailing list