I think the behaviour is ok, the main change is that missing string inputs are now detected and defaults used.
For example this function:
def test_string2(a, b="Default string"):
return f"a: {a}\ntype(a):{type(a)}\nb: {b}\ntype(b):{type(b)}"
Will use "Default String" if b is not supplied.
I don't really see an issue with not being able to pass in an empty string. If you really needed to you could do:
def test_string3(a, b=""):
return f"a: {a}\ntype(a):{type(a)}\nb: {b}\ntype(b):{type(b)}"
So define the function with a default of an empty string.