Any built-in ishashable method ?
Peter Otten
__peter__ at web.de
Fri Jan 18 06:22:28 EST 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