Signature.bind does not tell you if a missing argument is keyword-only for example. I created the following snippet to examine the differences:
import inspect
def run(f):
try:
f()
except TypeError as exc:
print(exc.args[0])
else:
raise RuntimeError('Expected to raise!')
sig = inspect.signature(f)
try:
sig.bind()
except TypeError as exc:
print(exc.args[0])
else:
raise RuntimeError('Expected to raise!')
print()
@run
def f1(pos_only, /): ...
@run
def f2(pos_or_kw): ...
@run
def f3(*, kw_only): ...
Output on current 3.9 master:
f1() missing 1 required positional argument: 'pos_only'
missing a required argument: 'pos_only'
f2() missing 1 required positional argument: 'pos_or_kw'
missing a required argument: 'pos_or_kw'
f3() missing 1 required keyword-only argument: 'kw_only'
missing a required argument: 'kw_only'
I am willing to create a PR so that the TypeError for f3 says "missing a required keyword-only argument: 'kw_only'", if this would be accepted.
|