[Python-Dev] Re: Use for enumerate

Barry A. Warsaw barry@zope.com
Sat, 27 Apr 2002 14:49:23 -0400


>>>>> "IK" == Ian Kjos <ikjos@email.uophx.edu> writes:

    IK> PS: This is a good argument for pre-object-death destructors
    IK> a'la C++. I think resources should be finalized as soon as
    IK> they are no longer accessable through other means. I realize
    IK> that there are issues to be resolved; perl does it by
    IK> following the law of most (!) astonishment. /me dives into
    IK> some documentation.

Here's a 5 minute toy example...

-Barry

-------------------- snip snip --------------------/tmp/play.py
class resource:
    def __init__(self, resource, func):
        self.__resource = resource
        self.__func = func

    def __call__(self, *args, **kws):
        self.__resource.acquire()
        try:
            rtn = self.__func(*args, **kws)
        finally:
            self.__resource.release()
        return rtn


class FileResource:
    def __init__(self, filename):
        self._filename = filename
        self._fp = None
        self.firstbyte = resource(self, self.firstbyte)

    def acquire(self):
        assert self._fp is None
        self._fp = file(self._filename)

    def release(self):
        assert self._fp is not None
        self._fp.close()
        self._fp = None

    def firstbyte(self):
        self._fp.seek(0)
        return self._fp.read(1)
    

fr = FileResource('/tmp/play.py')
print 'firstbyte:', fr.firstbyte()
assert fr._fp is None