szukam najlepszego sposobu, aby połączyć funkcję ze słownikiem który zawiera więcej elementów niż wejść w funkcję zaJak wywołać funkcję ze słownikiem, który zawiera więcej elementów niż funkcja ma parametry?
podstawowy ** kwarg rozpakowanie nie w tym przypadku:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
Po niektórych badań wymyśliłem następujące podejście:
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
Moje pytanie brzmi: czy jest to dobry sposób radzenia sobie z tym problemem, czy jest jakiś lepszy praktyka czy istnieje mechan ism w języku, którego może mi brakować?
Dzięki. Powinienem wspomnieć być może, że buduję ramy dla programu, w którym inne osoby (czasami względni nowicjusze w pytonie) tworzą funkcje. Dlatego wolałbym, żeby nie musieli radzić sobie z ** kwargs, ale raczej za pomocą podstawowych funkcji wejściowych: foo (a, b); Chciałbym ukryć tę ** kwargs, filtrując złożoność funkcji użyteczności. –