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/