[Python-3000] PEP: Eliminate __del__
Raymond Hettinger
python at rcn.com
Fri May 4 17:22:45 CEST 2007
[Michael Bayer]
> why not encapsulate the "proper" weakref-based approach in an easy-to-
> use method such as "__close__()" ? that way nobody has to guess how
> to follow this pattern.
An encapsulating function should be added to the weakref module
so that Guido's example could be written as:
class BufferedWriter:
def __init__(self, raw):
self.raw = raw
self.buffer = ""
weakref.cleanup(self, lambda s: s.raw.write(s.buffer))
def write(self, data):
self.buffer += data
if len(self.buffer) >= 8192:
self.flush()
def flush(self):
self.raw.write(self.buffer)
self.buffer = ""
I've got a first cut at an encapsulating function but am not happy with it yet.
There is almost certainly a better way. First draft:
def cleanup(obj, callback, _reg = []):
class AttrMap(object):
def __init__(self, map):
self._map = map
def __getattr__(self, key):
return self._map[key]
def wrapper(wr, mp=AttrMap(obj.__dict__), callback=callback):
_reg.remove(wr)
callback(mp)
_reg.append(ref(obj, wrapper))
Raymond
More information about the Python-3000
mailing list