ich nach dem besten Weg suchen, eine Funktion mit einem Wörterbuch kombinieren , die mehr Elemente als die Eingänge der Funktion enthältWie kann man eine Funktion mit einem Wörterbuch aufrufen, das mehr Elemente enthält als die Funktion Parameter hat?
Grund ** kwarg auspacken versagt in diesem Fall:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
Nach einigen Recherchen ich kam mit dem folgenden Ansatz auf:
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
Meine Frage ist: ist dies ein guter Weg, um mit diesem Problem umzugehen, oder gibt es eine bessere Praxis oder gibt es eine mechan Ismus in der Sprache, die ich vielleicht vermisse?
Dank. Ich hätte vielleicht erwähnen sollen, dass ich ein Framework für ein Programm entwickle, in dem andere Leute (manchmal relative Novizen in Python) die Funktionen erstellen. Daher würde ich bevorzugen, dass sie sich nicht mit den Kwargen befassen müssen, sondern eher mit grundlegenden Funktionseingaben: foo (a, b); Ich möchte diese ** kwargs filtering complexity in Utility-Funktionen verbergen. –