I am trying to use an object as the key value to a dictionary in Python. I follow the recommendations from some other posts that we need to implement 2 functions: __hash__
and __eq__
And with that, I am expecting the following to work but it didn't.
class Test:def __init__(self, name):self.name = namedef __hash__(self):return hash(str(self.name))def __eq__(self, other):return str(self.name) == str(other,name)def TestMethod():test_Dict = {}obj = Test('abc')test_Dict[obj] = objprint "%s" %(test_Dict[hash(str('abc'))].name) # expecting this to print "abc"
But it is giving me a key error message:
KeyError: 1453079729188098211
You don't need to redefine hash
and eq
to use an object as dictionary key.
class Test:def __init__(self, name):self.name = nametest_Dict = {}obj = Test('abc')
test_Dict[obj] = objprint test_Dict[obj].name
This works fine and print abc
.
As explained by Ignacio Vazquez-Abrams you don't use the hash of the object but the object itself as key to access the dictionary value.
The examples you found like python: my classes as dict keys. how? or Object of custom type as dictionary key redefine hash
and eq
for specific purpose.
For example consider these two objects obj = Test('abc')
and obj2 = Test('abc')
.
test_Dict[obj] = obj
print test_Dict[obj2].name
This will throw a KeyError
exception because obj and obj2 are not the same object.
class Test:def __init__(self, name):self.name = namedef __hash__(self):return hash(str(self.name))def __eq__(self, other):return str(self.name) == str(other.name)obj = Test('abc')
obj2 = Test('abc') test_Dict[obj] = obj
print test_Dict[obj2].name
This print abc
. obj
and obj2
are still different objects but now they have the same hash and are evaluated as equals when compared.