[Python-Dev] Implementation of PEP 341
Nick Coghlan
ncoghlan at gmail.com
Sun Nov 13 13:27:26 CET 2005
Thomas Lee wrote:
> Hi all,
>
> I've been using Python for a few years and, as of a few days ago,
> finally decided to put the effort into contributing code back to the
> project.
>
> I'm attempting to implement PEP 341 (unification of try/except and
> try/finally) against HEAD. However, this being my first attempt at a
> change to the syntax there's been a bit of a learning curve.
Thanks for having a go at this.
> I've modified Grammar/Grammer to use the new try_stmt grammar, updated
> Parser/Python.asdl to accept a stmt* finalbody for TryExcept instances
> and modified Python/ast.c to handle the changes to Python.asdl -
> generating an AST for the finalbody.
Consider leaving the AST definition alone, and simply changing the frontend
parser to process:
try:
BLOCK1
except:
BLOCK2
finally:
BLOCK3
almost precisely as if it were written:
try:
try:
BLOCK1
except:
BLOCK2
finally:
BLOCK3
That is, generate a TryExcept inside a TryFinally at the AST level, rather
than trying to give TryExcept the ability to handle a finally block directly.
Specifically, if you've determined that a finally clause is present in the
extended statement in Python/ast.c, do something like:
inner_seq = asdl_seq_new(1)
asdl_seq_SET(inner_seq, 0,
TryExcept(body_seq, handlers, else_seq, LINENO(n))
return TryFinally(inner_seq, finally_seq, LINENO(n))
body_seq and else_seq actually have meaningful names like suite_seq1 and
suite_seq2 in the current code ;)
Semantics-wise, this is exactly the behaviour we want, and making it pure
syntactic sugar means the backend doesn't need to care about the new syntax at
all. It also significantly lessens the risk of the change causing any problems
in the compilation of normal try-except blocks.
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
---------------------------------------------------------------
http://boredomandlaziness.blogspot.com
More information about the Python-Dev
mailing list