[Python-Dev] 'mapping' in weakrefs unneeded?

Andrew Dalke dalke@acm.org
Thu, 29 Mar 2001 16:07:17 -0700


Hello all,

  I'm starting to learn how to use weakrefs.  I'm curious
about the function named 'mapping'.  It is implemented as:

> def mapping(dict=None,weakkeys=0):
>     if weakkeys:
>         return WeakKeyDictionary(dict)
>     else:
>         return WeakValueDictionary(dict)

Why is this a useful function?  Shouldn't people just call
WeakKeyDictionary and WeakValueDictionary directly instead
of calling mapping with a parameter to specify which class
to construct?

If anything, this function is very confusing.  Take the
associated documentation as a case in point:

> mapping([dict[, weakkeys=0]]) 
> Return a weak dictionary. If dict is given and not None,
> the new dictionary will contain the items contained in dict.
> The values from dict must be weakly referencable; if any
> values which would be inserted into the new mapping are not
> weakly referencable, TypeError will be raised and the new
> mapping will be empty.
>
> If the weakkeys argument is not given or zero, the values in
> the dictionary are weak. That means the entries in the
> dictionary will be discarded when no strong reference to the
> value exists anymore. 
>
> If the weakkeys argument is nonzero, the keys in the
> dictionary are weak, i.e. the entry in the dictionary is
> discarded when the last strong reference to the key is
> discarded. 

As far as I can tell, this documentation is wrong, or at
the very least confusing.  For example, it says:
> The values from dict must be weakly referencable

but when the weakkeys argument is nonzero,
> the keys in the dictionary are weak

So must both keys and values be weak?  Or only the keys?
I hope the latter since there are cases I can think of
where I want the keys to be weak and the values be types,
hence non-weakreferencable.

Wouldn't it be better to remove the 'mapping' function and
only have the WeakKeyDictionary and WeakValueDictionary.
In which case the documentation becomes:

> WeakValueDictionary([dict]) 
> Return a weak dictionary. If dict is given and not None,
> the new dictionary will contain the items contained in dict.
> The values from dict must be weakly referencable; if any
> values which would be inserted into the new mapping are not
> weakly referencable, TypeError will be raised and the new
> mapping will be empty.
>
> The values in
> the dictionary are weak. That means the entries in the
> dictionary will be discarded when no strong reference to the
> value exists anymore. 

> WeakKeyDictionary([dict]) 
> Return a weak dictionary. If dict is given and not None,
> the new dictionary will contain the items contained in dict.
> The keys from dict must be weakly referencable; if any
> keys which would be inserted into the new mapping are not
> weakly referencable, TypeError will be raised and the new
> mapping will be empty.
>
> The keys in
> the dictionary are weak. That means the entries in the
> dictionary will be discarded when no strong reference to the
> key exists anymore. 

Easier to read and to see the parallels between the two
styles, IMHO of course.

I am not on this list though I will try to read the
archives online for the next couple of days.  Please
CC me about any resolution to this topic.

Sincerely,

                    Andrew
                    dalke@acm.org