Ищу лучший способ совместить функцию со словарем , который содержит больше элементов, чем входы функционального направленияКак вызвать функцию со словарем, который содержит больше элементов, чем функция имеет параметры?
основной ** kwarg распаковка терпит неудачу в этом случае:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
После некоторых исследований Я придумал следующий подход:
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
Мой вопрос: это хороший способ справиться с этой проблемой, или есть лучшая практика или есть механ ism на языке, который мне не хватает, возможно?
Спасибо. Я должен был упомянуть, возможно, что я создаю рамки для программы, где другие люди (иногда относительные новички в python) создают функции. Следовательно, я бы предпочел, чтобы им не приходилось иметь дело с ** kwargs, а скорее с использованием базовых функций: foo (a, b); Я хотел бы скрыть эту сложность фильтрации kwargs в функциях полезности. –