How to say $a=$b->{"A"} ||={} in Python?
Steve Holden
steve at holdenweb.com
Fri Aug 17 20:42:28 EDT 2007
Carl Banks wrote:
> On Aug 16, 10:01 pm, Paul McGuire <pt... at austin.rr.com> wrote:
>> On Aug 16, 8:28 pm, Jonathan Gardner
>>
>>
>>
>> <jgardner.jonathangardner.... at gmail.com> wrote:
>>> On Aug 16, 3:35 pm, beginner <zyzhu2... at gmail.com> wrote:
>>>> In perl it is just one line: $a=$b->{"A"} ||={}.
>>> a = b.setdefault('A', {})
>>> This combines all two actions together:
>>> - Sets b['A'] to {} if it is not already defined
>>> - Assigns b['A'] to a
>>> More info on dict methods here:
>>> http://docs.python.org/lib/typesmapping.html
>> No, this has already been proposed and discarded. The OP does NOT
>> want this, because it always generates an empty {} whether it is
>> needed or not. Not really a big hardship, but if the default value
>> were some expensive-to-construct container class, then you would be
>> creating one every time you wanted to reference a value, on the chance
>> that the key did not exist.
>>
>> Carl Banks' post using defaultdict is the correct solution. The
>> raison d'etre for defaultdict, and the reason that it is the solution
>> to the OP's question, is that instead of creating a just-in-case
>> default value every time, the defaultdict itself is constructed with a
>> factory method of some kind (in practice, it appears that this factory
>> method is usually the list or dict class constructor). If a reference
>> to the defaultdict gives a not-yet-existing key, then the factory
>> method is called to construct the new value, that value is stored in
>> the dict with the given key, and the value is passed back to the
>> caller. No instances are created unless they are truly required for
>> initializing an entry for a never-before-seen key.
>
>
> When I made my response, it occurred to me that Python could be
> improved (maybe) if one could overload dict.get() to use a factory,
> like so:
>
> b = {}
> a = b.get(k,factory=dict)
> a['A'] = 1
>
> That's a slight improvement (maybe) over defaultdict since it would
> still allow the same dict to have the membership check in other
> places. I'm not so sure overloading get to let it modify the dict is
> a good idea, though.
>
> Actually, it'd probably be fairly uncontroversial to add a factory
> keyword to dict.setdefault(). At least insofar as setdefault is
> uncontroversial.
>
Well it's uncontroversial enough to have made it into the distribution,
which represents a tacit admission by Guido that the .get() method alone
didn't implement his full vision.
The python-dev thread that discussed the feature before implementation
(as so often is the case) exercised many of the possible design paths,
and would be a useful read. [Damn, now I have to
well-known-search-engine it]. Aah, right - I'd forgotten how long it
took to get it right. This would be a suitable starting-point - it's the
beginning of the /third/ round of discussion:
http://mail.python.org/pipermail/python-dev/2006-February/061485.html
Many alternatives were discussed, and my memory at this distance is that
Guido had good reasons for choosing the exact API he did for defaultdict.
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------
More information about the Python-list
mailing list