Python - 如果已定义则传递参数,否则使用默认值

时间:2015-03-27 19:47:28

标签: python arguments

我正在尝试使用字典的值进行函数调用。

该函数有许多参数,大多数都带有默认值。

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)

2 个答案:

答案 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