This proposal is an alternative to Rodrigo's "Keyword arguments
self-assignment" thread.
Rodrigo, please feel free to mine this for useful nuggets in your PEP.
(I don't claim to have invented the syntax -- I think it might have been
Alex Hall?)
lol everyone thinks I invented things I didn't...
I just suggested making the brackets curly to make it a bit more dict-like.
Keyword Unpacking Shortcut
--------------------------
Inside function calls, the syntax
**{identifier [, ...]}
expands to a set of `identifier=identifier` argument bindings.
This will be legal anywhere inside a function call that keyword
unpacking would be legal. That means that syntactically it will legal to
mix this between other keyword arguments:
# currently legal
func(z=5, **d1, x=0, y=6, **d2, w=7)
# propose to allow Keyword Unpacking Shortcut as well
func(z=5, **d1, x=0, **{u, v}, y=6, **d2, w=7)
# which would be equivalent to:
func(z=5, **d1, x=0, u=u, v=v, y=6, **d2, w=7)
My issue with this, and maybe it's what Andrew is also trying to say, is that it breaks our usual assumptions about composing expressions. `{u, v}` is an expression, it represents a set, and it always represents that wherever you put it. Under your proposal, these two programs are both valid syntax with different meanings:
f(**{u, v})
x = {u, v}
f(**x)
Is there anything else similar in the language? Obviously there are cases where the same text has different meanings in different contexts, but I don't think you can ever refactor an expression (or text that looks like an expression) into a variable and change its meaning while keeping the program runnable.
This proposal makes it harder for beginners to understand how a program is interpreted. It breaks the simple mental model where building blocks are combined in a consistent fashion into larger parts.
The example above looks a bit dumb, but maybe users will try:
```
if flag:
kwargs = {u, v}
else:
kwargs = {w, x}
f(**kwargs)
```
Which is valid syntax but is wrong. Then they might try changing that to:
f(**({u, v} if flag else {w, x}))
which is suddenly invalid syntax. This is a very weird user experience. On that note, is this valid?
f(**({u, v}))