[Python-ideas] PEP: Dict addition and subtraction
James Lu
jamtlu at gmail.com
Mon Mar 4 20:01:38 EST 2019
> On Mar 4, 2019, at 11:25 AM, Steven D'Aprano <steve at pearwood.info> wrote:
>
> The PEP gives a good example of when this "invariant" would be
> unnecessarily restrictive:
>
> For example, updating default configuration values with
> user-supplied values would most often fail under the
> requirement that keys are unique::
>
> prefs = site_defaults + user_defaults + document_prefs
>
>
> Another example would be when reading command line options, where the
> most common convention is for "last option seen" to win:
>
> [steve at ando Lib]$ grep --color=always --color=never "zero" f*.py
> fileinput.py: numbers are zero; nextfile() has no effect.
> fractions.py: # the same way for any finite a, so treat a as zero.
> functools.py: # prevent their ref counts from going to zero during
>
Indeed, in this case you would want to use {**, **} syntax.
> and the output is printed without colour.
>
> (I've slightly edited the above output so it will fit in the email
> without wrapping.)
>
> The very name "update" should tell us that the most useful behaviour is
> the one the devs decided on back in 1.5: have the last seen value win.
> How can you update values if the operation raises an error if the key
> already exists? If this behaviour is ever useful, I would expect that it
> will be very rare.
> An update or merge is effectively just running through a loop setting
> the value of a key. See the pre-Python 1.5 function above. Having update
> raise an exception if the key already exists would be about as useful as
> having ``d[key] = value`` raise an exception if the key already exists.
>
> Unless someone can demonstrate that the design of dict.update() was a
> mistake
You’re making a logical mistake here. + isn’t supposed to have .update’s behavior and it never was supposed to.
> , and the "require unique keys" behaviour is more common,
I just have. 99% of the time you want to have keys from one dict override another, you’d be better off doing it in-place and so would be using .update() anyways.
> then
> I maintain that for the very rare cases you want an exception, you can
> subclass dict and overload the __add__ method:
Well, yes, the whole point is to define the best default behavior.
More information about the Python-ideas
mailing list