Antoon Pardon wrote:
Well the only suggestion I would make now is that it would be nice to
have a second dict type that would make a copy of a key and insert
that copy in the dictionary.

(At least) two options here, depending on what you really need.

(1) Use current dicts. They will still give you a key error if you mutate a list that is hashed by value:

py> class hashablelist(list):
...     def __hash__(self):
...         return hash(tuple(self))
...
py> hlist = hashablelist([0])
py> hlist
[0]
py> d = {hlist:1}
py> d
{[0]: 1}
py> d[hlist]
1
py> hlist[0] = 1
py> d[hlist]
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
KeyError: [1]

Since you've said yourself that you don't think people should be mutating keys while they're in a dict, this behavior should serve most purposes. If you do care what the errors are when someone does mutate a key, using a dict means that you could potentially "lose" values after mutating a key. Continuing the example above:

py> d
{[1]: 1}
py> d[hashablelist([0])]
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
KeyError: [0]
py> d[hashablelist([1])]
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
KeyError: [1]


(2) If you want something that meets your specs better, sit down and write the 10 lines of code: =)


py> class copydict(object, UserDict.DictMixin):
...     def __init__(self, *args, **kwds):
...         self._dict = {}
...         self.update(*args, **kwds)
...     def __getitem__(self, key):
...         return self._dict[key]
...     def __setitem__(self, key, value):
...         self._dict[copy.deepcopy(key)] = value
...     def __iter__(self):
...         return iter(self._dict)
...
py> hlist = hashablelist([0])
py> cdict = copydict({hlist:1})
py> cdict[hlist]
1
py> hlist[0] = 1
py> cdict[hlist]
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "<interactive input>", line 6, in __getitem__
KeyError: [1]
py> cdict[hashablelist([0])]
1
py> list(cdict)
[[0]]

I personally, have zero need for such a class, but if you think that it's useful, and you think a lot of other people might use it, put together a PEP and ask for it to be added to, say, collections, in the standard library.

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to