[Python-ideas] dictionary constructor should not allow duplicate keys
Random832
random832 at fastmail.com
Wed May 4 09:30:03 EDT 2016
On Wed, May 4, 2016, at 08:22, Steven D'Aprano wrote:
> (1) Because status quo wins. In the absence of a really compelling
> reason to remove that check, we don't have to justify prohibing
> duplicate keyword args, we just have to note that it is already in place
> and so we shouldn't change it.
>
> (2) Duplicate keys in a dict may have side-effects, which mean they do
> something. Duplicate keyword arguments don't have side-effects (not in
> the keys at least). So that's a difference.
f(a=1, b=2, **{foo(): bar()}) where foo may return 'a' or 'b', though
this is the first that I've heard that the side-effect argument only
applies to the keys.
>
> (3) The analogy between function calls and dicts is not really that
> strong. The dict constuctor intentionally allows certain duplicates:
>
> py> dict({'a': None}, a=2)
> {'a': 2}
>
> for good reason
but not {**{'a': None}, **{'a': 2}})
> (think of over-riding the values provided in the input
> dict with keyword arguments), but it's not clear that there is an
> analogy for function calls. Perhaps there is, and if it is a good enough
> analogy, we might have to re-think the duplicate kwargs situation.
foo(**{'a':None}, a=2) seems like a perfect analogy to me.
More information about the Python-ideas
mailing list