[Python-Dev] PEP 340 - possible new name for block-statement
Josiah Carlson
jcarlson at uci.edu
Fri Apr 29 19:02:38 CEST 2005
Nick Coghlan <ncoghlan at gmail.com> wrote:
> Then, in Py3K, finalisation could simply become the default for loop behaviour.
> However, the '__finalise__' flag would result in some impressive code bloat, as
> any for loop would need to expand to:
>
> itr = iter(EXPR1)
> if getattr(itr, "__finalise__", False):
> # Finalised semantics
> # I'm trying to channel Guido here.
> # This would really look like whatever the PEP 340 block statement
> # semantics end up being
> val = arg = None
> ret = broke = False
> while True:
> try:
> VAR1 = next(itr, arg)
> except StopIteration:
> BLOCK2
> break
> try:
> val = arg = None
> ret = False
> BLOCK1
> except Exception, val:
> itr.__error__(val)
> if ret:
> try:
> itr.__error__(StopIteration())
> except StopIteration:
> pass
> return val
The problem is that BLOCK2 is executed within the while loop (the same
problem I had with a fix I offered), which may contain a break for
breaking out of a higher-level loop construct. Here's one that works as
you intended (though perhaps I'm being a bit to paranoid about the
__error__ attribute)...
val = arg = None
ret = ex_block_2 = False
while True:
try:
VAR1 = next(itr, arg)
except StopIteration:
ex_block_2 = True
break
try:
val = arg = None
ret = False
BLOCK1
except Exception, val:
if hasattr(itr, '__error__):
itr.__error__(val)
if ret:
try:
if hasattr(itr, '__error__'):
itr.__error__(StopIteration())
except StopIteration:
pass
return val
if ex_block_2:
BLOCK2
> P.S. I think PEP 340's proposed for loop semantics are currently incorrect, as
> BLOCK2 is unreachable. It should look more like the non-finalised semantics
> above (with BLOCK2 before the break in the except clause)
Indeed, I also mentioned this on Wednesday.
- Josiah
More information about the Python-Dev
mailing list