Sto cercando il modo migliore per combinare una funzione con un dizionario che contiene più elementi di input della funzioneCome chiamare una funzione con un dizionario che contiene più voci di quanti parametri ha la funzione?
base ** kwarg disimballaggio non riesce in questo caso:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
Dopo alcune ricerche sono venuto con il seguente approccio:
import inspect
# utilities
def get_input_names(function):
'''get arguments names from function'''
return inspect.getargspec(function)[0]
def filter_dict(dict_,keys):
return {k:dict_[k] for k in keys}
def combine(function,dict_):
'''combine a function with a dictionary that may contain more items than the function's inputs '''
filtered_dict = filter_dict(dict_,get_input_names(function))
return function(**filtered_dict)
# examples
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
print combine(foo,d)
--> 3
la mia domanda è: è questo un buon modo di affrontare questo problema, o c'è una pratica migliore o c'è un Mechan ism nella lingua che mi manca forse?
Grazie. Avrei dovuto menzionare forse che sto costruendo un framework per un programma in cui altre persone (talvolta novizi relativi in python) stanno creando le funzioni. Quindi, preferirei che non dovessero avere a che fare con i ** kwargs, ma piuttosto usando gli input delle funzioni di base: foo (a, b); Mi piacerebbe nascondere questo ** kwargs che filtra la complessità nelle funzioni di utilità. –