Postscript: Things are not as clean as I have hoped and said. However, I don't think this changes the general form of the conclusion. Just that a little more work is needed to achieve the goal.
Python 3.7 and 3.8:
>>> def f(x): pass
>>> f()
TypeError: f() missing 1 required positional argument: 'x'
Also note that in Python 3.8 we have:
>>> def f(x,/): pass
>>> f()
TypeError: f() missing 1 required positional argument: 'x'
Recall that we have
>>> len()
TypeError: len() takes exactly one argument (0 given)
Note that the parameter of 'f' has a name, but not the parameter for 'len'. I think I was expecting
>>> def f(x,/): pass
>>> f()
TypeError: f() takes exactly one argument (0 given)
--
Jonathan