Joel Hedlund wrote: > There's one thing about dictionaries and __hash__() methods that puzzle > me. I have a class with several data members, one of which is 'name' (a > str). I would like to store several of these objects in a dict for quick > access ({name:object} style). Now, I was thinking that given a list of > objects I might do something like > > d = {} > for o in objects: > d[o] = o > > and still be able to retrieve the data like so: > > d[name] > > if I just defined a __hash__ method like so: > > def __hash__(self): > return self.name.__hash__()
Just the hash is not enough. You need to define equality, too: >>> class Named(object): ... def __init__(self, name): ... self.name = name ... def __hash__(self): ... return hash(self.name) ... def __eq__(self, other): ... try: ... other_name = other.name ... except AttributeError: ... return self.name == other ... return self.name == other_name ... def __repr__(self): ... return "Named(name=%r)" % self.name ... >>> items = [Named(n) for n in "alpha beta gamma".split()] >>> d = dict(zip(items, items)) >>> d["alpha"] Named(name='alpha') Peter -- http://mail.python.org/mailman/listinfo/python-list