
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 <steve@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.