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

Viktor Roytman viktor.roytman at gmail.com
Fri Apr 12 12:02:42 EDT 2019


That is certainly an option for functions that you have defined for 
yourself, but generally not an option for a function from a library. I am 
interested in a solution that works in general.

On Friday, April 12, 2019 at 11:48:38 AM UTC-4, Chris Angelico wrote:
>
> On Sat, Apr 13, 2019 at 1:12 AM Viktor Roytman <viktor... at gmail.com 
> <javascript:>> 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 
> _______________________________________________ 
> Python-ideas mailing list 
> Python... at python.org <javascript:> 
> https://mail.python.org/mailman/listinfo/python-ideas 
> Code of Conduct: http://python.org/psf/codeofconduct/ 
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20190412/d216fc53/attachment.html>


More information about the Python-ideas mailing list