I’m not sure if this would work out the same way or not. And even if it does, that hurdle of describing the syntax in a way that people won’t get confused the way they do when they first learn the feature in C++ might be hard to overcome. But it’s at least plausible that it could be readable and learnable enough.

I'm not sure what's hard to explain.

When you see a function call like this:

foo(bar, *, spam, baz)

with an asterisk (*) sitting on its own looking like an argument, it's a shorthand for this:

foo(bar, spam=spam, baz=baz)

Every argument after the asterisk gets turned into a keyword argument where the argument name is the same as the variable name, i.e. <name>=<name>.

In a function definition (as opposed to a call), an asterisk sitting on its own between parameters has a different meaning, but there are similarities: every parameter after the asterisk is a keyword parameter.