[Python-Dev] Merging PEP 310 and PEP 340-redux?
Steven Bethard
steven.bethard at gmail.com
Thu May 12 07:09:35 CEST 2005
[Guido]
> Going for all-out simplicity, I would like to be able to write these examples:
>
> class locking:
> def __init__(self, lock): self.lock = lock
> def __enter__(self): self.lock.acquire()
> def __exit__(self, *args): self.lock.release()
>
> class opening:
> def __init__(self, filename): self.filename = filename
> def __enter__(self): self.f = open(self.filename); return self.f
> def __exit__(self, *args): self.f.close()\
>
> And do EXPR as VAR: BLOCK would mentally be translated into
>
> itr = EXPR
> VAR = itr.__enter__()
> try: BLOCK
> finally: itr.__exit__(*sys.exc_info()) # Except sys.exc_info() isn't
> defined by finally
Yeah, that's what I wanted to do too. That should be about what my
second suggestion did. Slightly updated, it looks like:
stmt = EXPR1
VAR1 = stmt.__enter__()
exc = () # or (None, None, None) if you prefer
try:
try:
BLOCK1
except:
exc = sys.exc_info()
finally:
if stmt.__exit__(*exc) is not None:
raise exc[0], exc[1], exc[2]
The only difference should be that with the above semantics if you
return a (non-None) value from __exit__, the exception will be
suppressed (that is, it will not be reraised). Means that if you want
to suppress an exception, you have to add a return statement (but if
you want exceptions to be reraised, you don't have to do anything.)
I suggest this only because there were a few suggested use-cases for
suppressing exceptions. OTOH, almost all my uses are just
try/finally's so I'm certainly not going to cry if that last finally
instead looks like:
finally:
stmt.__exit__(*exc)
raise exc[0], exc[1], exc[2]
=)
STeVe
--
You can wordify anything if you just verb it.
--- Bucky Katt, Get Fuzzy
More information about the Python-Dev
mailing list