[Python-Dev] collections module

Martin v. Loewis martin at v.loewis.de
Sat Jan 10 17:11:31 EST 2004


Raymond Hettinger wrote:

> If lambda is made parameterless, it allows type constructors to be used
> for the most common cases:
> 
> dict(default=list)	# this is clear enough
> dict(default=int)       # this may be too cute

A keyword parameter is a good idea - I had problems calling it
"default", though, as it would give the impression that you specify
the default value.

> Or, lambda could be avoided altogether by cloning a default value
> 
> dict(default=[]) # individual default values computed by
> copy([])
> dict(default=0)

This might work, but it would make copy.copy() part of the
dictionary semantics, whereas at the moment copy is just
a library.

>>Having a key in the lambda is probably better, as it would
>>also allow lazily-filled dictionaries.
> 
> Can you give an example?

We once had the need to evaluate code in an "unbounded"
context, i.e. where it is not possible/efficient to compute
a list of all variables upfront.

So in principle, we would have done

class D(dict):
   def __getitem__(self, key):
     return compute_value(key)

exec some_code in D(params)

except that instances of D() could not have been passed
to exec/eval - this requires a "true" dictionary.
I see that Python now allows to use D as the dictionary,
but still won't use __getitem__ to find values.

In the specific example, the "unbounded" context was
a CORBA namespace, for which we new that the bindings
would not randomly change. So we would very much have
liked a lazy filling of the dictionary - each access
to an uncached value is a roundtrip on the wire.

With a default value function, we could have done

exec some_code in dict(default=compute_value)

We ended up analyzing the code to find out what variables
are referenced, and prefetch those into a proper dictionary.

Regards,
Martin




More information about the Python-Dev mailing list