[Python-Dev] With statement (original) (raw)

Moore, Paul Paul.Moore@atosorigin.com
Tue, 4 Feb 2003 11:58:15 -0000


I'm rapidly tending towards a preference for extreme simplicity in the = with statement. My basic logic is that the C++ idiom for all this is pretty minimal, and works well (even though C++ has no "finally" equivalent, so = the need is more pressing in C++).

So, my current feeling is:

'with' expr ':'
    suite

expands to

_x =3D expr
if hasattr(_x, '__enter__'):
    _x.__enter__()
try:
    suite
finally:
if hasattr(_x, '__exit__'):
    _x.__exit__()

where _x is a hidden variable unavailable to the user.

And that's it. No assignment, no exception handling, no multiple = expressions.

The two use cases we've been looking at (locks and files) can be coded = as:

class autoclose:
    def __init__(self, f):
    self.f =3D f
def __exit__(self):
    self.f.close()

f =3D open("whatever")
with autoclose(f):
    # Use f

and

class autolock:
def __init__(self, l):
    self.l =3D l
def __enter__(self):
    self.l.acquire()
def __exit__(self):
    self.l.release()

l =3D lock() # or whatever
with autolock(l):
    # work with the lock held

(Thanks to Oren Tirosh for pointing out these idioms). Having autolock = as a subclass of lock also reads OK ("with l:" for "with the lock l held"), = but I don't think the file example reads well when expressed this way.

Alex Martelli suggested transactional processing may be a reasonable use = case for needing exception handling (commit in exit and rollback in = except) but I don't think the gain is worth the extra complexity - I'd say leave = this coded as now with try...except..else. (Alex - care to convince me = otherwise?)

If anyone feels a need for more than this, please supply a use case - I = can't think of anything concrete. Otherwise, this is what I'm going to put in = the PEP...

Paul.