Message243287
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! |
|
Date |
User |
Action |
Args |
2015-05-15 23:48:53 | r.david.murray | set | recipients:
+ r.david.murray, yselivanov |
2015-05-15 23:48:53 | r.david.murray | set | messageid: <1431733733.27.0.866799524337.issue24205@psf.upfronthosting.co.za> |
2015-05-15 23:48:53 | r.david.murray | link | issue24205 messages |
2015-05-15 23:48:52 | r.david.murray | create | |
|