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. -- http://mail.python.org/mailman/listinfo/python-list