> On Mon, Mar 04, 2019 at 10:01:23AM -0500, James Lu wrote:
>
> If you want to merge it without a KeyError, learn and use the more explicit
> {**d1, **d2} syntax.
On Mar 4, 2019, at 10:25 AM, Steven D'Aprano <st...@pearwood.info> wrote:
> In your previous email, you said the {**d ...} syntax was implicit:
>
> In other words, explicit + is better than implicit {**, **#, unless
> explicitly suppressed. Here + is explicit whereas {**, **} is
> implicitly allowing inclusive keys, and the KeyError is expressed
> suppressed by virtue of not using the {**, **} syntax.
>
> It is difficult to take your "explicit/implicit" argument seriously when
> you cannot even decided which is which.
I misspoke.
> In your previous email, you said the {**d ...} syntax was implicit:
>
> In other words, explicit + is better than implicit {**, **#, unless
> explicitly suppressed. Here + is explicit whereas {**, **} is
> implicitly allowing inclusive keys, and the KeyError is expressed
> suppressed by virtue of not using the {**, **} syntax.
>
> It is difficult to take your "explicit/implicit" argument seriously when
> you cannot even decided which is which.
Yes, + is explicit. {**, **} is implicit.
My argument:
We should set the standard that + is for non-conflicting merge and {**, **} is
for overriding merge. That standard should be so that + explicitly asserts that
the keys will not conflict whereas {**d1, **d2} is ambiguous on why d2 is
overriding d1.^
^Presumably you’re making a copy of d1 so why should d3 have d2 take priority?
The syntax deserves a comment, perhaps explaining that items from d2 are newer
in time or that the items in d1 are always nonces.
The + acts as an implicit assertion and an opportunity to catch an invariant
violation or data input error.
Give me an example of a situation where you need a third dictionary from two
existing dictionaries and having conflict where a key has a different value in
both is desirable behavior.
The situation where non-conflicting merge is what’s desired is more common and
in that case throwing an exception in the case of a conflicting value is a good
thing, a way to catch code smell.
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/