Pre-PEP: Dictionary accumulator methods - typing & initialising
Matteo Dell'Amico
della at toglimi.linux.it
Sun Mar 20 10:11:55 EST 2005
Kay Schluehr wrote:
> Why do You set
>
> d.defaultValue(0)
> d.defaultValue(function=list)
>
> but not
>
> d.defaultValue(0)
> d.defaultValue([])
>
> ?
I think that's because you have to instantiate a different object for
each different key. Otherwise, you would instantiate just one list as a
default value for *all* default values. In other words, given:
class DefDict(dict):
def __init__(self, default):
self.default = default
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
return self.default
you'll get
In [12]: d = DefDict([])
In [13]: d[42].extend(['foo'])
In [14]: d.default
Out[14]: ['foo']
In [15]: d[10].extend(['bar'])
In [16]: d.default
Out[16]: ['foo', 'bar']
In [17]: d[10]
Out[17]: ['foo', 'bar']
In [18]: d[10] is d.default
Out[18]: True
and this isn't what you really wanted.
By the way, to really work, I think that Duncan's proposal should create
new objects when you try to access them, and to me it seems a bit
counterintuitive. Nevertheless, I'm +0 on it.
> And why not dict(type=int), dict(type=list) instead where default
> values are instantiated during object creation? A consistent pythonic
> handling of all types should be envisioned not some ad hoc solutions
> that go deprecated two Python releases later.
I don't really understand you. What should 'type' return? A callable
that returns a new default value? That's exactly what Duncan proposed
with the "function" keyword argument.
--
Ciao,
Matteo
More information about the Python-list
mailing list