Re: The untimely dimise of a weak-reference
Bruno Desthuilliers wrote: Would be better with : return self.func(obj, *args, *kwds) Thanks -- well spotted! -- Greg -- http://mail.python.org/mailman/listinfo/python-list
RE: The untimely dimise of a weak-reference
Hi Gregory, You can create your own wrapper that keeps a weak reference to the underlying object. Here's an example. [...] Thanks for the code! Regards, Vincent -- http://mail.python.org/mailman/listinfo/python-list
RE: The untimely dimise of a weak-reference
Hi Christiaan, Instances of a class have no means of storing the bound method object. The or unbound bound method is a simple and small wrapper that keeps a reference to the class, self and the function object. Python keeps a pool of empty method objects in a free list. The creation of a new bound method just takes a few pointer assignments and three INCREFs. Okay, that also explains the consistent memory assignment. Maybe I'll create a bound-method caching object, see how slow/fast it is in comparison, and see what ever other issues I run into. Regards, Vincent -Original Message- From: python-list-bounces+v.vanbeveren=rijnhuizen...@python.org [mailto:python-list-bounces+v.vanbeveren=rijnhuizen...@python.org] On Behalf Of Christian Heimes Sent: vrijdag 30 juli 2010 16:44 To: python-list@python.org Subject: Re: The untimely dimise of a weak-reference Am 30.07.2010 16:06, schrieb Vincent van Beveren: I did not know the object did not keep track of its bound methods. What advantage is there in creating a new bound method object each time its referenced? It seems kind of expensive. Christian -- http://mail.python.org/mailman/listinfo/python-list -- http://mail.python.org/mailman/listinfo/python-list
Re: The untimely dimise of a weak-reference
Gregory Ewing a écrit : (snip) import weakref class weakmethod(object): def __init__(self, bm): self.ref = weakref.ref(bm.im_self) self.func = bm.im_func def __call__(self, *args, **kwds): obj = self.ref() if obj is None: raise ValueError(Calling dead weak method) self.func(obj, *args, **kwds) Would be better with : return self.func(obj, *args, *kwds) -- http://mail.python.org/mailman/listinfo/python-list
The untimely dimise of a weak-reference
Hi everyone, I was working with weak references in Python, and noticed that it was impossible to create a weak-reference of bound methods. Here is a little python 3.0 program to prove my point: import weakref print(Creating object...) class A(object): def b(self): print(I am still here) a = A() def d(r): print(Aaah! Weakref lost ref) print(Creating weak reference) r = weakref.ref(a.b, d) print(Oh, wait, its already gone!) print(Ref == None, cause of untimely demise: %s % r()) print(Object is still alive: %s % a) print(Function is still exists: %s % a.b) print(See:) a.b() I also tried this in Python 2.5 and 2.6 (with minor modifications to the syntax of course), and it yielded the exact same behavior. Why is this, and is there anything I can do about it? I wish to reference these bound functions, but I do not want to keep them in memory once the object they belong to is no longer referenced. Regards, Vincent van Beveren ___ Ing. V. van Beveren Software Engineer, FOM Rijnhuizen E: v.vanbeve...@rijnhuizen.nl -- http://mail.python.org/mailman/listinfo/python-list
Re: The untimely dimise of a weak-reference
Vincent van Beveren wrote: Hi everyone, I was working with weak references in Python, and noticed that it was impossible to create a weak-reference of bound methods. Here is a little python 3.0 program to prove my point: import weakref print(Creating object...) class A(object): def b(self): print(I am still here) a = A() def d(r): print(Aaah! Weakref lost ref) print(Creating weak reference) r = weakref.ref(a.b, d) The instance doesn't keep a reference of its bound method. Rather the bound method keeps a reference of its instance. Every time you say a.b you get a different bound method. What do you think should keep it alive? print(Oh, wait, its already gone!) print(Ref == None, cause of untimely demise: %s % r()) print(Object is still alive: %s % a) print(Function is still exists: %s % a.b) print(See:) a.b() I also tried this in Python 2.5 and 2.6 (with minor modifications to the syntax of course), and it yielded the exact same behavior. Why is this, and is there anything I can do about it? I wish to reference these bound functions, but I do not want to keep them in memory once the object they belong to is no longer referenced. I fear you have to manage the methods' lifetime explicitly. Peter -- http://mail.python.org/mailman/listinfo/python-list
RE: The untimely dimise of a weak-reference
Hi Peter, I did not know the object did not keep track of its bound methods. What advantage is there in creating a new bound method object each time its referenced? It seems kind of expensive. Regards, Vincent -Original Message- From: Peter Otten [mailto:__pete...@web.de] Sent: vrijdag 30 juli 2010 15:06 To: python-list@python.org Subject: Re: The untimely dimise of a weak-reference Vincent van Beveren wrote: Hi everyone, I was working with weak references in Python, and noticed that it was impossible to create a weak-reference of bound methods. Here is a little python 3.0 program to prove my point: import weakref print(Creating object...) class A(object): def b(self): print(I am still here) a = A() def d(r): print(Aaah! Weakref lost ref) print(Creating weak reference) r = weakref.ref(a.b, d) The instance doesn't keep a reference of its bound method. Rather the bound method keeps a reference of its instance. Every time you say a.b you get a different bound method. What do you think should keep it alive? print(Oh, wait, its already gone!) print(Ref == None, cause of untimely demise: %s % r()) print(Object is still alive: %s % a) print(Function is still exists: %s % a.b) print(See:) a.b() I also tried this in Python 2.5 and 2.6 (with minor modifications to the syntax of course), and it yielded the exact same behavior. Why is this, and is there anything I can do about it? I wish to reference these bound functions, but I do not want to keep them in memory once the object they belong to is no longer referenced. I fear you have to manage the methods' lifetime explicitly. Peter -- http://mail.python.org/mailman/listinfo/python-list
RE: The untimely dimise of a weak-reference
Vincent van Beveren wrote: I did not know the object did not keep track of its bound methods. What advantage is there in creating a new bound method object each time its referenced? It seems kind of expensive. While I didn't measure it I suppose that it saves a lot of memory. Peter -- http://mail.python.org/mailman/listinfo/python-list
Re: The untimely dimise of a weak-reference
Am 30.07.2010 16:06, schrieb Vincent van Beveren: I did not know the object did not keep track of its bound methods. What advantage is there in creating a new bound method object each time its referenced? It seems kind of expensive. Instances of a class have no means of storing the bound method object. The or unbound bound method is a simple and small wrapper that keeps a reference to the class, self and the function object. Python keeps a pool of empty method objects in a free list. The creation of a new bound method just takes a few pointer assignments and three INCREFs. Christian -- http://mail.python.org/mailman/listinfo/python-list
Re: The untimely dimise of a weak-reference
Vincent van Beveren wrote: I was working with weak references in Python, and noticed that it was impossible to create a weak-reference of bound methods. is there anything I can do about it? You can create your own wrapper that keeps a weak reference to the underlying object. Here's an example. import weakref class weakmethod(object): def __init__(self, bm): self.ref = weakref.ref(bm.im_self) self.func = bm.im_func def __call__(self, *args, **kwds): obj = self.ref() if obj is None: raise ValueError(Calling dead weak method) self.func(obj, *args, **kwds) if __name__ == __main__: class A(object): def foo(self): print foo method called on, self a = A() m = weakmethod(a.foo) m() del a m() -- http://mail.python.org/mailman/listinfo/python-list