[Python-Dev] collections.idset and collections.iddict? (original) (raw)

Ian Bicking ianb at colorstudy.com
Tue Mar 7 07:04:45 CET 2006


Guido van Rossum wrote:

On 3/6/06, Raymond Hettinger <python at rcn.com> wrote:

[Neil Schemenauer]

I occasionally need dictionaries or sets that use object identity rather than hash to store items. Would it be appropriate to add these to the collections module? Why not decorate the objects with a class adding a method: def hash(self): return id(self)

That would seem to be more Pythonic than creating custom variants of other containers. I hate to second-guess the OP, but you'd have to override eq too, and probably ne and cmp just to be sure. And probably that wouldn't do -- since the default hash and eq have the desired behavior, the OP is apparently talking about objects that override these operations to do something meaningful; overriding them back presumably breaks other functionality. I wonder if this use case and the frequently requested case-insensitive dict don't have some kind of generalization in common -- perhaps a dict that takes a key function a la list.sort()?

That's what occurred to me as soon as I read Neil's post as well. I think it would have the added benefit that it would be case insensitive while still preserving case. Here's a rough idea of the semantics:

from UserDict import DictMixin

class KeyedDict(DictMixin):

 def __init__(self, keyfunc):
     self.keyfunc = keyfunc
     self.data = {}

 def __getitem__(self, key):
     return self.data[self.keyfunc(key)][1]

 def __setitem__(self, key, value):
     self.data[self.keyfunc(key)] = (key, value)

 def __delitem__(self, key):
     del self.data[self.keyfunc(key)]

 def keys(self):
     return [v[0] for v in self.data.values()]

I definitely like this more than a key-normalizing dictionary -- the normalized key is never actually exposed anywhere. I didn't follow the defaultdict thing through to the end, so I didn't catch what the constructor was going to look like for that; but I assume those choices will apply here as well.

-- Ian Bicking | ianb at colorstudy.com | http://blog.ianbicking.org



More information about the Python-Dev mailing list