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

Chris Barker chris.barker at noaa.gov
Tue Jun 5 12:44:59 EDT 2018


I think your proposal got a bit confused by the choice of names, and that
you were proposing two things, one of which I think already exists
(setdefault).

So, I _think_ what you are proposing is that there be a method something
like:

def exclusive_add(self, key, value):
    if key in self:
        raise KeyError("the key: {} already exists in this
dict".format(key))
    self[key] = value

Which would make sense if  that is a common use case, and you make a pretty
good case for that, with the analogy to UNIQUE in database tables.

I will point out that  the DB case is quite different, because python dicts
have a way to of spelling it that's really pretty straightforward,
performant and robust.

However, .setdefault() is essentially a replacement for:

if key in a_dict:
    value = a_dict(key)
else:
    a_dict[key] = default_value
    value = default_value

or a similar try: except block:

try:
    value = a_dict[key]
except KeyError:
    a_dict[key] = default_value
    value = default_value

And I'm glad it's there.

So - -if this is a fairly common use case, then maybe it's worth adding.

Note that this would be adding a new method to not just dict, but to the
entire mapping protocol (ABC) -- so maybe a heavier lift than you're
imagining.

-CHB

PS: making sure this is what you are suggesting:

In [*12*]: *class* *my_dict*(dict):

    ...:     *def* exclusive_add(self, key, value):

    ...:         *if* key *in* self:

    ...:             *raise* *KeyError*("the key: *{}* already exists in
this dict".format(key))

    ...:         self[key] = value

    ...:


In [*13*]: d = my_dict()


In [*14*]: d.exclusive_add('this', 5)


In [*15*]: d.exclusive_add('that', 6)


In [*16*]: d.exclusive_add('this', 7)

---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-16-b7600f2469fb> in <module>()

----> 1 d.exclusive_add('this', 7)


<ipython-input-12-5f1c0f0709c6> in exclusive_add(self, key, value)

*      2*     def exclusive_add(self, key, value):

*      3*         if key in self:

----> 4             raise KeyError("the key: {} already exists in this
dict".format(key))

*      5*         self[key] = value

*      6*


KeyError: 'the key: this already exists in this dict'

-- 

Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker at noaa.gov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180605/6ee7d2f2/attachment-0001.html>


More information about the Python-ideas mailing list