[Python-ideas] Add dict.append and dict.extend

Steven D'Aprano steve at pearwood.info
Mon Jun 4 20:25:56 EDT 2018


On Mon, Jun 04, 2018 at 02:22:29PM -0700, Ben Rudiak-Gould wrote:
> I'd like to propose adding `append` and `extend` methods to dicts
> which behave like `__setitem__` and `update` respectively, except that
> they raise an exception (KeyError?) instead of overwriting preexisting
> entries.
> 
> Very often I expect that the key I'm adding to a dict isn't already in
> it. 

Can you give some examples of when you want to do that? I'm having 
difficulty in thinking of any. The only example I thought of is when you 
have a "preferences" or "settings" dict, and you want to add default 
settings but only if the user hasn't provided them. But the way to do 
that is to go in the opposite direction, starting with the defaults, and 
unconditionally add user settings, overriding the default.

    # wrong way (yes, I've actually done this :-(
    settings = get_user_prefs()
    for key, value in get_default_prefs():
        if key not in settings:
            settings[key] = value

    # right way
    settings = get_default_prefs()
    settings.update(get_user_prefs())


So I'm afraid I don't see the value of this.

> If I want to verify that, I have to expand my single-line
> assignment statement to 3-5 lines (depending on whether the dict and
> key are expressions that I now need to assign to local variables).

I'm sorry, I can't visualise how it would take you up to five lines to 
check and update a key. It shouldn't take more than two:

if key not in d:
    d[key] = value

Can you give an real-life example of the five line version?


> The names `append` and `extend` make sense now that dicts are defined
> to preserve insertion order: they try to append the new entries, and
> if that can't be done because it would duplicate a key, they raise an
> exception.

I don't see any connection between "append" and "fail if the key already 
exists". That's not what it means with lists.


-- 
Steve


More information about the Python-ideas mailing list