[Python-Dev] Acquire/release functionality (original) (raw)

Moore, Paul Paul.Moore@atosorigin.com
Mon, 3 Feb 2003 15:24:26 -0000


From: Aahz [mailto:aahz@pythoncraft.com]

It's not at all contrived. And I think it's perfectly acceptable; it's no different, fundamentally, from calling f.close() twice by mistake.

I blew the example, as I forgot that multiple close() calls were OK. And maybe Alex's point that cleanup should be callable multiple times kills the whole argument.

But I'm not entirely sure I follow your comment. Are you saying that you think that using the same object in 2 with statements (where, by definition, in the second the object will be "already cleaned up") is acceptable, or that you think it's a mistake (in which case, are you saying that we shouldn't care because the coder made a mistake?)

Actually, I think I'm guilty of muddy thinking here, in any case. I can imagine a single "manager" object, which could be entirely valid in multiple with statements:

# Reusing the tired old file closing example, sorry, I'm
# too befuddled to think up a new example right now...
class manager:
    def __init__(self, f =3D None):
        self.f =3D f
    def control(self, f):
        self.f =3D f
    def __exit__(self):
        if self.f:
            self.f.close()
        self.f =3D None

f =3D open("whatever.txt")
M =3D manager(f)

with M:
    # use M.f, could expose this better...

M.control(open("another.txt"))
with M:
    ...

I really can't decide if this is reasonable use, or horrible abuse. Or somewhere in between. I'm pretty sure I wouldn't like to have to = maintain code like this at short notice, though...

Time to stop responding to messages and have a good think about all of this.

Paul.