Viktor is looking for something at the call site, not the function definition site (which he might not control).

I wrote calllib (horrible name, I know). It can do this, although I just noticed it needs updating for keyword-only params.

But, here it is without keyword-only params:

>>> from calllib import apply
>>> def func(a):
...   print(f'a={a!r}')
...
>>> func(**{'a': 1, 'b': 2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func() got an unexpected keyword argument 'b'
>>> apply(func, {'a': 1, 'b': 2})
a=1

I don't claim it's an efficient solution, since it inspects the callable every time to extract its params. But it will work for this use case. Or at least it will when I update it for keyword-only params. It works today without keyword-only params.

https://pypi.org/project/calllib/

Eric

On 4/12/2019 12:17 PM, Lucas Bourneuf wrote:
Hello !

I made *fief*, a small python package allowing just that using a decorator:

     from fief import filter_effective_parameters as fief

     @fief
     def func(a, b):
         # some implementation

     # and then, use it as you want to:
     func(**MY_BIG_CONFIG_DICT_WITH_MANY_WEIRD_KEYS)

The code is quite simple. You may want to use it, with modifications (i didn't 
touch the code for months, maybe years ; it could probably be improved now).
Link: https://github.com/aluriak/fief

The code:

def filter_effective_parameters(func):
     """Decorator that filter out parameters in kwargs that are not related to
     any formal parameter of the given function.
     """
     @wraps(func)
     def wrapper(*args, **kwargs):
         formal_parameters = frozenset(signature(func).parameters.keys())
         return func(*args, **{
             arg: value
             for arg, value in kwargs.items()
             if arg in formal_parameters
         })
     return wrapper

Best regards,
--lucas



----- Mail original -----
De: "Viktor Roytman" <viktor.royt...@gmail.com>
À: "python-ideas" <python-id...@googlegroups.com>
Envoyé: Vendredi 12 Avril 2019 18:01:43
Objet: Re: [Python-ideas] Syntax for allowing extra keys when unpacking a dict 
as keyword arguments

I could see this being an option, but to someone unfamiliar with it, it
might seem strange that * unpacks iterables, ** unpacks dicts, and *** is a
special thing only for keyword arguments that mostly behaves like **.

On Friday, April 12, 2019 at 11:26:37 AM UTC-4, Bruce Leban wrote:


On Fri, Apr 12, 2019, 8:12 AM Viktor Roytman <viktor...@gmail.com
<javascript:> wrote:


     >>> func(**{'a': 1, 'b': 2})
     Traceback (most recent call last):
       File "<stdin>", line 1, in <module>
     TypeError: func() got an unexpected keyword argument 'b'


Perhaps func(***kws)?

I think this is a real problem given the frequent convention that you can
freely add fields to json objects with the additional fields to be ignored.


_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to