"specialdict" module
Georg Brandl
g.brandl at gmx.net
Sun Apr 3 14:23:16 EDT 2005
Jeff Epler wrote:
> The software you used to post this message wrapped some of the lines of
> code. For example:
>> def __delitem__(self, key):
>> super(keytransformdict, self).__delitem__(self,
>> self._transformer(key))
Somehow I feared that this would happen.
> In defaultdict, I wonder whether everything should be viewed as a
> factory:
> def setdefaultvalue(self, value):
> def factory(): return value
> self.setdefaultfactory(factory)
That's a reasonable approach. __init__ must be changed too, but this
shouldn't hurt too badly.
> and the "no-default" mode would either cease to exist, or
> def cleardefault(self):
> def factory():
> raise KeyError, "key does not exist and no default defined"
> self.setdefaultfactory(factory)
> (too bad that the key isn't available in the factory, this degrades the
> quality of the error messge)
That can be worked around with a solution in __getitem__, see below.
> if so, __getitem__ becomes simpler:
> __slots__ = ['_default']
> def __getitem__(self, key):
> try:
> return super(defaultdict, self).__getitem__(key)
> except KeyError:
> return self.setdefault(key, apply(*self._default))
You are peculating the kwargs. Also, apply() is on the verge of being
deprecated, so better not use it.
def __getitem__(self, key):
try:
return super(defaultdict, self).__getitem__(key)
except KeyError, err:
try:
return self.setdefault(key,
self._default[0](*self._default[1],
**self._default[2]))
except KeyError:
raise err
Although I'm not sure whether KeyError would be the right one to raise
(perhaps a custom error?).
> I don't ever have an itch for sorted dictionaries, as far as I can
> remember, and I don't immediately understand the use of
> keytransformdict. Can you give an example of it?
See the thread "Case-insensitive dict, non-destructive, fast, anyone?",
starting at 04/01/05 12:38.
mfg
Georg
More information about the Python-list
mailing list