我正在尝试使用字典的值进行函数调用。
该函数有许多参数,大多数都带有默认值。
def foo(name, a=None, b='', c=12):
print(name,a,b,12)
如果完全填充了字典,则函数调用将如下所示。
def call_foo(arg_dict):
foo(name=arg_dict['name'], a=arg_dict['a'], b=arg_dict['b'], c=arg_dict['c'])
我需要使函数调用依赖于这些键是否实际存在于字典中。因此,如果只存在一个参数的子集,我只传递这些参数。
def call_foo(arg_dict):
if 'a' in arg_dict and 'b' in arg_dict and 'c' in arg_dict:
foo(name=arg_dict['name'], a=arg_dict['a'], b=arg_dict['b'], c=arg_dict['c'])
elif 'a' in arg_dict and 'c' in arg_dict:
foo(name=arg_dict['name'], a=arg_dict['a'], c=arg_dict['c'])
使用大量可选参数,这种类型的表达式将很快变得无法管理。
如何定义要传递给foo的命名参数列表?类似于以下内容。
def call_foo(arg_dict):
arg_list = []
arg_list.append(name=arg_dict['name'])
if 'a' in arg_dict:
arg_list.append(a=arg_dict['a'])
if 'b' in arg_dict:
arg_list.append(b=arg_dict['b'])
if 'c' in arg_dict:
arg_list.append(c=arg_dict['c'])
foo(arg_list)
答案 0 :(得分:3)
你可以用kwargs的双星调用函数:
def call_foo(arg_dict):
foo(**arg_dict)
这意味着你甚至可能不需要call_foo
开始。
This StackOverflow post如果您想了解更多关于明星和双星论证如何运作的信息,那么会有很多详细信息。
答案 1 :(得分:1)
您只需致电
即可def call_foo(arg_dict):
foo(**arg_dict)
您创建了arg_list
(不需要它)。但是如果有机会,你可以将列表作为参数传递,
def call_foo(arg_dict):
foo(*arg_list)
它接受列表的相应索引的参数。
也不需要if 'a' in dict and 'b' in dict and 'c' in dict:
,只需
args = ['a','b','c']
if all([(i in arg_dict) for i in args]):
不要使用dict
作为变量名或参数,它可能会覆盖内置dict