[Python-bugs-list] [ python-Bugs-660098 ] New style classes and __hash__
SourceForge.net
noreply@sourceforge.net
Tue, 11 Feb 2003 15:01:31 -0800
Bugs item #660098, was opened at 2002-12-30 13:39
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=660098&group_id=5470
Category: None
Group: None
Status: Open
Resolution: None
>Priority: 3
Submitted By: Thomas Heller (theller)
Assigned to: Guido van Rossum (gvanrossum)
Summary: New style classes and __hash__
Initial Comment:
New style classes obviously inherit a __hash__
implementation from object which returns the id. Per
default this allows using instances as dictionary keys,
but usually with the wrong behaviour, because most
often user classes are mutable, and their contained data
should be used to calculate the hash value.
IMO one possible solution would be to change
typeobject.c:object_hash() to raise TypeError, and
change all the immutable (core) Python objects to use
_Py_HashPointer in their tp_hash slot.
----------------------------------------------------------------------
>Comment By: Guido van Rossum (gvanrossum)
Date: 2003-02-11 18:01
Message:
Logged In: YES
user_id=6380
I spent an afternoon looking into this, and I can't see an
easy solution. The idea of only inheriting __hash__ together
with certain other slots is really flawed; it may be better
if object DIDN'T define a default implementation for
__hash__, comparisons (both flavors), and other things, or
maybe the default __hash__ should raise an exception when
the comparisons are not those inherited from object, or
maybe PyType_Ready should insert a dummy __hash__ when it
sees that you redefine __eq__, or... I really don't know.
I'm going to sleep on this some more, and lower the
priority. You can always get the right behavior by
explicitly defining __hash__.
----------------------------------------------------------------------
Comment By: Thomas Heller (theller)
Date: 2002-12-30 13:50
Message:
Logged In: YES
user_id=11105
You mean at the end of the inherit_slots() function?
For my extension which I'm currently debugging, tp_compare,
tp_richcompare, and tp_hash are inherited from base, but
only tp_hash is != NULL there.
----------------------------------------------------------------------
Comment By: Guido van Rossum (gvanrossum)
Date: 2002-12-30 13:44
Message:
Logged In: YES
user_id=6380
There seems to be code that tries to inherit tp_hash only
when tp_compare and tp_richcompare are also inherited, but
it seems to be failing.
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=105470&aid=660098&group_id=5470