New submission from R. David Murray: I have an application where I'm calling a handler function with passed in arguments. I want to generate an error if the handler is called with the wrong arguments. I can't just catch TypeError since a TypeError could easily result from some programming error in the handler, rather than an error in the calling args. So, doing this seems obvious:
sig = signature(handler) try: bound = sig.bind(message, payload, *args, **kw) except TypeError as exc: print("Invalid handler call: {}".format(str(exc)) handler(*bound.args, **bound.kwargs) Now, suppose I have a function like: def foo(message, payload, anarg, akeyword='bar'): pass If I call it directly with an invalid keyword argument I get: >>> foo(1, 2, 3, badword=7) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() got an unexpected keyword argument 'badword' However, bind gives me: >>> sig.bind(1, 2, 3, badword=7) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/rdmurray/python/p35/Lib/inspect.py", line 2818, in bind return args[0]._bind(args[1:], kwargs) File "/home/rdmurray/python/p35/Lib/inspect.py", line 2809, in _bind raise TypeError('too many keyword arguments') TypeError: too many keyword arguments Similarly, for a missing argument I get: >>> foo(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: foo() missing 1 required positional argument: 'anarg' While bind gives: >>> sig.bind(1, 2) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/rdmurray/python/p35/Lib/inspect.py", line 2818, in bind return args[0]._bind(args[1:], kwargs) File "/home/rdmurray/python/p35/Lib/inspect.py", line 2737, in _bind raise TypeError(msg) from None TypeError: 'anarg' parameter lacking default value So, using this to replace catching the TypeError from incorrectly calling a function does not work. Nor are the messages in fact accurate. Is there any chance we could make bind's error handling work like regular function binding? That's certainly what I expected would happen! ---------- components: Library (Lib) messages: 243287 nosy: r.david.murray, yselivanov priority: normal severity: normal status: open title: signature.bind error messages are sub-optimal type: behavior versions: Python 3.5 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue24205> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com