This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author r.david.murray
Recipients r.david.murray, yselivanov
Date 2015-05-15.23:48:52
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1431733733.27.0.866799524337.issue24205@psf.upfronthosting.co.za>
In-reply-to
Content
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!
History
Date User Action Args
2015-05-15 23:48:53r.david.murraysetrecipients: + r.david.murray, yselivanov
2015-05-15 23:48:53r.david.murraysetmessageid: <1431733733.27.0.866799524337.issue24205@psf.upfronthosting.co.za>
2015-05-15 23:48:53r.david.murraylinkissue24205 messages
2015-05-15 23:48:52r.david.murraycreate