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

George Leslie-Waksman waksman at gmail.com
Mon Jun 4 18:57:32 EDT 2018


Semantically, I'm not sure append and extend would be universally
understood to mean don't overwrite.

This can be accomplished with a custom subclass for your use case:

```
import collections


class OverwriteGuardedDict(collections.UserDict):
    def append(self, key, value):
        if key in self.data:
            raise KeyError(key)
        self.data[key] = value

    def extend(self, other):
        overlap = self.data.keys() & other.keys()
        if overlap:
            raise KeyError(','.join(overlap))
        self.data.update(other)
```

On Mon, Jun 4, 2018 at 2:24 PM Ben Rudiak-Gould <benrudiak at gmail.com> 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. 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). If
> I don't verify it, I may overwrite a dict entry and produce silently
> wrong output.
>
> 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.
>
> In case of error, `extend` should probably leave successfully appended
> entries in the dict, since that's consistent with list.extend and
> dict.update.
>
> The same methods would also be useful on sets. Unfortunately, the
> names make less sense.
>
> -- Ben
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180604/7f278667/attachment.html>


More information about the Python-ideas mailing list