[Python-Dev] Merging PEP 310 and PEP 340-redux?
Alex Martelli
aleax at aleax.it
Tue May 10 16:57:43 CEST 2005
On May 9, 2005, at 21:58, Guido van Rossum wrote:
> Apologies if this has been discovered and rejected already; I've had
> to skip most of the discussions but this though won't leave my head...
Skimming rather than skipping all of the discussion burned most of my
py-dev time, and it was just skimming, but I don't remember such
rejections.
> But what if we changed the translation slightly so that VAR gets
> assigned to value of the __enter__() call:
>
> abc = EXPR
> VAR = abc.__enter__() # I don't see why it should be
> optional
> try:
> BLOCK
> finally:
> abc.__exit__()
>
> Now it would make more sense to change the syntax to
>
> with EXPR as VAR:
> BLOCK
>
> and we have Phillip Eby's proposal. The advantage of this is that you
I like this. The only aspect of other proposals that I would sorely
miss here, would be the inability for abc.__exit__ to deal with
exceptions raised in BLOCK (or, even better, a separate specialmethod
on abc called in lieu of __exit__ upon exceptions). Or am I missing
something, and would this give a way within abc.__exit__ to examine
and possibly ``unraise'' such an exception...?
> can write a relatively straightforward decorator, call it
> @with_template, that endows a generator with the __enter__ and
> __exit__ methods, so you can write all the examples (except
> auto_retry(), which was there mostly to make a point) from PEP 340
> like this:
>
> @with_template
> def opening(filename, mode="r"):
> f = open(filename, mode)
> yield f
> f.close()
>
> and so on. (Note the absence of a try/finally block in the generator
> -- the try/finally is guaranteed by the with-statement but not by the
> generator framework.)
I must be thick this morning, because this relatively straightforward
decorator isn't immediately obvious to me -- care to show me how
with_template gets coded?
Alex
More information about the Python-Dev
mailing list