Anders Hovmöller writes:
I'll take the explicit use of locals any time.
I meant "locals" the function. I should have written "locals()".
My suggestion isn't about introducing more magic, just a little bit of convenience
It's syntax, which is always magic, or, if you prefer, "has arbitrary semantics which must be memorized". As syntax, it's ugly (IMO) and nonintuitive (by the rationale that "=" is an infix binary relation or assignment operator, not a unary prefix operator). Not to forget redundant, given the existence of locals() and positional arguments.
for two common use cases: passing along variables with the same name to another function
If the two functions were designed with similar signatures, using positional arguments is the obvious way to indicate this, at a saving of one "=" per argument. If they weren't and you don't feel like looking up the signature of the function you're calling (or are worried that the signature might change in a future version), **locals() wins at the expense of bringing in (possibly) a bunch of junk you don't want. But it's way shorter than a sequence of even *three* =-prefixed variable names (unless they're "x", "y", and "z"). I don't see a win here big enough to justify syntax, let alone *this* syntax.
and throwing a bunch of variables into a dict (which is basically the same thing since "dict(foo=foo)" == "{'foo': foo}").
This is a little more plausible, since you can't pun on the names of the parameters when using positional arguments, since dicts don't have positional arguments. Still, adding syntax is a high hurdle.