[issue14631] Instance methods and WeakRefs don't mix.

2012-11-26 Thread Jesús Cea Avión

Changes by Jesús Cea Avión j...@jcea.es:


--
nosy: +jcea

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-26 Thread Jesús Cea Avión

Changes by Jesús Cea Avión j...@jcea.es:


--
superseder:  - Instance methods and WeakRefs don't mix.

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-26 Thread Jesús Cea Avión

Changes by Jesús Cea Avión j...@jcea.es:


--
superseder: Instance methods and WeakRefs don't mix. - 

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-17 Thread Roundup Robot

Roundup Robot added the comment:

New changeset 27c20650aeab by Antoine Pitrou in branch 'default':
Issue #14631: Add a new :class:`weakref.WeakMethod` to simulate weak references 
to bound methods.
http://hg.python.org/cpython/rev/27c20650aeab

--
nosy: +python-dev

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-17 Thread Antoine Pitrou

Antoine Pitrou added the comment:

Committed, thank you!

--
resolution:  - fixed
stage: patch review - committed/rejected
status: open - closed

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-12 Thread Mark Dickinson

Mark Dickinson added the comment:

The patch looks okay to me.

What does inheriting from 'ref' buy you?  This feels a bit strange to me: the 
way I think of it, the WeakMethod *has* a weakref to the underlying object, 
rather than *being* a weakref to the underlying object.  The __repr__ also 
seems a bit misleading as a result:

 o = Object()
 m = o.some_method
 WeakMethod(m)
weakref at 0x100665ae0; to 'Object' at 0x101115840

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-12 Thread Antoine Pitrou

Antoine Pitrou added the comment:

 What does inheriting from 'ref' buy you?

Hmm, I'm not sure. I thought I'd mimick KeyedRef's inheritance design, plus 
isinstance(..., weakref.ref) works, and composition would make the object 
slightly bigger. Other than that, probably nothing.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Mark Dickinson

Mark Dickinson added the comment:

Adding some useful links from Simon Feltman in issue 16452.

See also:
http://bugs.python.org/issue813299
http://bugs.python.org/issue7464

This is the recipes:
http://code.activestate.com/recipes/81253/
http://mindtrove.info/python-weak-references/

--
nosy: +sfeltman

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Simon Feltman

Simon Feltman added the comment:

Just a note this is also referred to as a WeakMethod by some folks (so this 
ticket shows up in those searches). See also:
http://bugs.python.org/issue813299
http://bugs.python.org/issue7464
http://bugs.python.org/issue16452

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Mark Dickinson

Changes by Mark Dickinson dicki...@gmail.com:


--
versions: +Python 3.4 -Python 3.3

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Antoine Pitrou

Antoine Pitrou added the comment:

WeakMethod sounds like a good name to me. However, instead of acting as a 
proxy, I think it should act as a regular weakref (i.e. you have to call it to 
get the actual method object).

--
nosy: +pitrou

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Antoine Pitrou

Antoine Pitrou added the comment:

Here is a patch adding a WeakMethod class. It still lacks docs, I'll add some 
if people agree on the principle.

--
keywords: +patch
Added file: http://bugs.python.org/file27960/weakmethod.patch

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Daniel Urban

Changes by Daniel Urban urban.dani...@gmail.com:


--
nosy: +daniel.urban

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Simon Feltman

Simon Feltman added the comment:

The WeakCallableRef that was attached seemed to support regular functions (or 
anything callable) which is nice. The naming also leaves room for a 
WeakCallableProxy.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-11-11 Thread Simon Feltman

Simon Feltman added the comment:

Some more complex examples from various libraries:

https://github.com/django/django/blob/master/django/dispatch/saferef.py
https://github.com/11craft/louie/blob/master/louie/saferef.py

I think both of these originated in pydispatcher.

--

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-04-20 Thread Sundance

New submission from Sundance sunda...@ierne.eu.org:

SUMMARY
===

The behavior of instance methods makes it impossible to keep a weakref on them. 
The reference dies instantly even if the instance and the method still exist.


EXAMPLE
===

 import weakref

 callbacks = weakref.WeakSet()

 def callback1():
...   print In callback1.

 class SomeClass:
...   def callback2(self):
... print In callback2.

 some_instance = SomeClass()

 callbacks.add( callback1 )
 callbacks.add( some_instance.callback2 )

 for callback in callbacks:
...   callback()
In callback1.

 ## callback2 is never called!


ANALYSIS


The WeakSet in the example above, and the weakref.ref() it employs, actually 
behave as specified. It's the particular nature of bound methods that causes 
the unexpected behavior.

From what I understand, instance methods are bound dynamically when looked up 
on the instance. A new object of type instancemethod is created each time:

 t1 = some_instance.callback
 t2 = some_instance.callback
 t1 is t2
False

So when a program calls weakref.ref(some_instance.callback), a new 
instancemethod object is created on the fly, a weakref to that object is 
created... and the instancemethod object dies, because its refcount is 0.

This fundamental difference between instance methods and other callables makes 
it painful to implement weakly referencing callback registries.


PROPOSED SOLUTION
=

Changing the fundamental nature of instance methods to accommodate one single 
corner case doesn't seem worthwhile.

Similarly, changing the behavior of weakref.ref(), which does work as 
specified, is probably not a good idea.

My approach is thus to provide a new helper, WeakCallableRef, that behaves like 
weakref.ref(), but is safe to use on callables and does what you would 
naturally expect with instance methods.

It works by binding the lifetime of the ref to that of 1/ the instance bearing 
the method, and 2/ the unbound method itself. It is also safe to use on other 
function types beside instance methods, so implementations of callback 
registries don't have to special case depending on the callable type.

The unexpected behavior should also be mentioned somewhere in the weakref 
documentation, by the way.

See attached file for a proposed implementation.

--
components: Library (Lib)
files: WeakCallableRef.py
messages: 158828
nosy: Sundance
priority: normal
severity: normal
status: open
title: Instance methods and WeakRefs don't mix.
type: behavior
versions: Python 2.7
Added file: http://bugs.python.org/file25288/WeakCallableRef.py

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com



[issue14631] Instance methods and WeakRefs don't mix.

2012-04-20 Thread Mark Dickinson

Mark Dickinson dicki...@gmail.com added the comment:

I quite like the WeakCallableRef idea, having had to work around this problem 
myself in the past (using a similar mechanism).

This looks like a feature request rather than a bug report, though;  changing 
Type and Versions accordingly.

--
nosy: +mark.dickinson
stage:  - patch review
type: behavior - enhancement
versions: +Python 3.3 -Python 2.7

___
Python tracker rep...@bugs.python.org
http://bugs.python.org/issue14631
___
___
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com