Any built-in ishashable method ?

Peter Otten __peter__ at web.de
Fri Jan 18 12:22:28 CET 2013


Jean-Michel Pichavant wrote:

> Hello people,
> 
> Is there any built-in way to know if an object is a valid dictionary key ?
> From what I know, the object must be hashable, and from the python doc, an
> object is hashable if it has the __hash__ and (__cmp__ or __eq__) methods.
> 
> http://docs.python.org/2/glossary.html#term-hashable
> 
> I found this on the net, but considering the above definition, does it
> really check the cmp/eq existence ?
> 
> def ishashable(x):
>     try:
>         hash(x)
>     except TypeError:
>         return False
>     else:
>         return True
> 
> I was trying to know if any custom class can be used as a dict key. It
> looks like you can. Yet I'm a little bit concerned, because last time I
> used invalid objects as keys, I got a bug that was really difficult to
> spot.

Hm, but trying to put an unhashable key into a dict gives the obvious 
exception:

>>> class A(object):
...     __hash__ = None
... 
>>> {A(): 42}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'A'

So I'm guessing you had a key where

key1 == key2 did not imply hash(key1) == hash(key2)

I don't see a way to avoid that problem in a look-before-you-leap test.




More information about the Python-list mailing list