Issue1622207
Created on 2006-12-26.03:45:50 by leosoto, last changed 2007-06-19.07:13:44 by cgroves.
msg1378 (view) |
Author: Leonardo Soto (leosoto) |
Date: 2006-12-26.03:45:50 |
|
Jython seems to impose a non standard restriction here, as CPython doesn't have any problem with this code:
>>> import _weakref, UserDict
>>> _weakref.ref(UserDict.UserDict())
But it raises TypeError on Jython (2.3 branch at least).
I'm attaching a simple patch, but I don't know if that's the "right way" or not.
|
msg1379 (view) |
Author: Deleted User leouserz (leouserz) |
Date: 2007-01-16.00:20:23 |
|
ugh, it almost seems like a bug to me that something so basic as hashCode is throwing Exceptions. The patch is probably going to cover up something else that's more maniacal.
|
msg1380 (view) |
Author: Mr. Codepage (codepage) |
Date: 2007-02-06.03:10:09 |
|
The attached patch solved my problem with weakref. My repro case is below.
from weakref import *
wvd = WeakValueDictionary()
try:
wvd_hash = hash(wvd)
except Exception,e:
print e, "this was expected"
try:
wvd_ref = ref(wvd)
print wvd_ref
except Exception, e:
print e, "this exception was NOT expected, running under jython"
foo@foo-desktop:~/jython_dev$ python weakref_bug.py
unhashable instance this was expected
<weakref at 0xb7dbdfcc; to 'instance' at 0xb7dbbcec>
foo@foo-desktop:~/jython_dev$ jython weakref_bug.py
unhashable instance this was expected
<weakref 1; to 'instance' object>
If we could get any comments from a core jython dev on this bug that would be great.
|
msg1381 (view) |
Author: Charlie Groves (cgroves) |
Date: 2007-04-25.08:08:43 |
|
The patch makes the hash value for all unhashable PyObjects 0. Combined with the way GlobalRefs are used in a hashtable, this means that creating refs for two equal but distinct objects will only make a single ref. This is undesirable as illustrated in the example I'm attaching: calling the second ref returns the first object.
The only solution I can think of is to use System.identityHashCode(object) instead of object.hashCode(). As long as there isn't a case where Jython creates two separate Objects that refer to the same underlying Python object that should be fine. I can't think of anything like that off the top of my head.
File Added: surprising_assignment.py
|
msg1382 (view) |
Author: Lars Heuer (lheuer) |
Date: 2007-05-11.10:06:45 |
|
Even if the object defines a __hash__ method, the WeakValueDictionary does not work:
>>> class X(object):
def __init__(self, id):
self.id = id
def __hash__(self):
return hash(self.id)
>>> # Code taken from the CPython example:
>>> import weakref
>>> _id2obj_dict = weakref.WeakValueDictionary()
>>> def remember(obj):
oid = id(obj)
_id2obj_dict[oid] = obj
return oid
>>> x = X(123)
>>> remember(x)
Traceback (innermost last):
...
TypeError: unhashable instance
|
msg1383 (view) |
Author: Charlie Groves (cgroves) |
Date: 2007-06-19.07:13:44 |
|
This is fixed in r3259.
|
|
Date |
User |
Action |
Args |
2006-12-26 03:45:50 | leosoto | create | |
|