Difference of hash and __hash__()

Jeff Epler jepler at unpythonic.net
Tue Sep 2 18:34:56 EDT 2003


On Wed, Sep 03, 2003 at 07:35:31AM +1000, Delaney, Timothy C (Timothy) wrote:
> > From: Terry Reedy [mailto:tjreedy at udel.edu]
> > 
> > "Stefan Fleiter" <stefan.fleiter at web.de> wrote in message
> > news:bj2nv5$hna$1 at news.web.de...
> > 
> > > under Python 2.2.2:
> > >
> > >  >>> s = slice(None,5,None)
> > >  >>> hash(s)
> > > Traceback (most recent call last):
> > >    File "<stdin>", line 1, in ?
> > > TypeError: unhashable type
> > >  >>> s.__hash__()
> > > 136775584
> > >
> > > Can anybody explain this?
> > 
> > It looks like a bug.  Extended slices were added for use by Numerical
> > Python.  It may never have tried to hash them or only done so only
> > through the C equivavlent of s.__hash__.  Extended slicing of
> > sequences was, I believe, only added in 2.3.
> 
> Looks like a bug to me too. Stefan, please raise a bug report on Sourceforge (or it will get lost). Preferably add a patch and test suite ;)
> 
> Tim Delaney

No, it's apparently deliberate that slices don't hash (so that
{}[1:2] raises an error).  I think that slice(None).__hash__ is from
object.__hash__, but this is rightfully(?) ignored by PyObject_Hash()
which looks at tp_hash (NULL for slice objects) and tp_compare (non-NULL
for slice objects) with the result that the object is treated as
unhashable.

Jeff





More information about the Python-list mailing list