New submission from Mark Dickinson <dicki...@gmail.com>:

Nicholas Cole noted on python-list that the behaviour of weakref.proxy with 
respect to equality changed between 2.x and 3.x:

Python 2.7 (r27:82500, Aug 15 2010, 14:21:15) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import weakref 
>>> s = set() 
>>> s == weakref.proxy(s) 
False 

Python 3.1.2 (r312:79147, Aug 20 2010, 20:06:00) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import weakref 
>>> s = set() 
>>> s == weakref.proxy(s) 
True

This seems to be an inadvertent change resulting from the switch from 3-way 
comparisons to rich comparisons:  the 2.x source implements tp_compare for 
proxy objects.  The tp_compare slot *does* unwrap the proxy objects before 
comparing, but since the tp_compare slot in general  is only ever called (for 
objects implemented in C) when the types of the objects being compared are the 
same, a proxy object won't compare equal to its referent.

I believe that Nicholas ran into this when using weakrefs as elements of 
containers.  Nicholas:  is that right?  Care to elaborate?

The 3.x source changes this to use tp_richcompare (see r51533), so now a proxy 
object *does* compare equal to its referent.

The 3.x behaviour seems better to my limited eyes, and the 2.x behaviour has 
been around a long time without causing problems, so we probably don't want to 
change the behaviour in either case.  But it might be good to document the 
difference somewhere.

----------
messages: 114557
nosy: mark.dickinson
priority: normal
severity: normal
status: open
title: weakref.proxy unequal to its referent in 2.x
type: behavior
versions: Python 2.6, Python 2.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue9658>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to