[Python-ideas] Syntax for allowing extra keys when unpacking a dict as keyword arguments

Chris Angelico rosuav at gmail.com
Fri Apr 12 11:47:21 EDT 2019


On Sat, Apr 13, 2019 at 1:12 AM Viktor Roytman <viktor.roytman at gmail.com> wrote:
>
> Currently, unpacking a dict in order to pass its items as keyword arguments to a function will fail if there are keys present in the dict that are invalid keyword arguments:
>
>     >>> def func(*, a):
>     ...     pass
>     ...
>     >>> func(**{'a': 1, 'b': 2})
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in <module>
>     TypeError: func() got an unexpected keyword argument 'b'
>
> The standard approach I have encountered in this scenario is to pass in the keyword arguments explicitly like so
>
>     func(
>         a=kwargs_dict["a"],
>         b=kwargs_dict["b"],
>         c=kwargs_dict["c"],
>     )
>
> But this grows more cumbersome as the number of keyword arguments grows.
>
> There are a number of other workarounds, such as using a dict comprehension to select only the required keys, but I think it would be more convenient to have this be a feature of the language. I don't know what a nice syntax for this would be, or even how feasible it is.
>

I'm not 100% sure I understand your proposal, so I'm going to restate
it; anywhere that I'm misrepresenting you, please clarify!

Given this function and this dictionary:

def func(*, a):
    pass

args = {'a': 1, 'b': 2}

you want to call the function, passing the recognized argument 'a' the
value from the dict, but ignoring the superfluous 'b'.

Are you able to alter the function? If so, just add kwargs to it:

def func(*, a, **_):
    pass

and then any unrecognized args will quietly land in the junk dictionary.

ChrisA


More information about the Python-ideas mailing list