If I delete/rename a field of a class in any statically checked language, it's going to report a compile error, and it's still a breaking change. Same thing with named arguments.
Even if you don't use keyword args your parameter names are still part of your API surface in Python because callers can directly name positional args. Only recently have you been able enforce unnamed positional only args as well as the opposite.
Typically when you're changing a name you're changing behavior, too. This isn't just something we should let slip under the radar, otherwise bugs can actually manifest.
In fact, I think OCaml has one of the best labeled argument system around there. The only downside is that it doesn't always interact well with currying, but perhaps languages without currying could just copy all the rest.
Just to elaborate a bit, in OCaml you can have functions like:
let foo ~a ?b c =
let b = match b with
| None -> 42
| Some x -> x
in a + b + c
And you can then call this like foo ~a:1 ~b:42 55 or foo ~a:2 ?b:None 55. But then forwarding those optional parameters works like: let bar ~a ?b c =
foo ~a ?b c
and the optional parameter b will be forwarded as an optional parameter.Given Rust's historical relations with OCaml I'm slightly disappointed that it doesn't have the same labeled and optional argument system.