Re: The untimely dimise of a weak-reference

2010-08-03 Thread Gregory Ewing

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

2010-08-02 Thread Vincent van Beveren
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

2010-08-02 Thread Vincent van Beveren
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

2010-08-02 Thread Bruno Desthuilliers

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

2010-07-30 Thread Vincent van Beveren
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

2010-07-30 Thread Peter Otten
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

2010-07-30 Thread Vincent van Beveren
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

2010-07-30 Thread Peter Otten
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

2010-07-30 Thread Christian Heimes
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

2010-07-30 Thread Gregory Ewing

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