Stefan Fleiter <stefan.fleiter@web.de> wrote:
Hilft dir das Modul weakref?
OK, nun hab ich mein Problem mit weakref. Erstmal der Code: ################################################################################ import weakref class GOb: __olist=[] def c_show_all(): for i in GOb.__olist: i.show() def proxy_callback(x): print "callback" GOb.__olist.remove(x) proxy_callback=staticmethod(proxy_callback) c_show_all=staticmethod(c_show_all) def __init__(self, name="GOB", priority=0): self.priority=priority self.name=name ref=weakref.proxy(self, GOb.proxy_callback) GOb.__olist.append(ref) GOb.__olist.sort() def __del__(self): print "Destruktor called for GOB " + self.name def show(self): print self.name + " " + str(self.priority) def __cmp__(self, other): if self.priority < other.priority: return -1 elif self.priority == other.priority: return 0 else: return 1 if __name__ == '__main__': a=GOb("T1", 0) b=GOb("T2", 2) c=GOb("T3", 1) GOb.c_show_all() del a GOb.c_show_all() ################################################################################ So klappts leider nicht, denn: Wenn der callback des Proxy-Objektes aufgerufen wird, ist das Objekt schon nicht mehr existent und der Destruktor des Objektes wird noch später aufgerufen: $ python ex.py 1 0 T3 1 T2 2 callback Exception exceptions.ReferenceError: 'weakly-referenced object no longer exists' in <function proxy_callback at 0x403c5fb4> ignored Destruktor called for GOB T1 [...] Die Doku sagt: ... 'callback', if given, is called with a reference to the proxy when it is about to be finalized... Hm, 'about to' übersetze ich mich 'kurz bevor', also sollte ja zu der Zeit, in der der callback stattfindet das Objekt noch existieren, oder? Wie krieg ich das Objekt wieder aus meiner __olist[]? Walter _______________________________________________ Python-de maillist - Python-de@python.net http://python.net/mailman/listinfo/python-de