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

use*_*250 1 python arguments

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

该函数采用许多参数,大多数具有默认值。

def foo(name, a=None, b='', c=12):
    print(name,a,b,12)
Run Code Online (Sandbox Code Playgroud)

如果字典已完全填充,函数调用将如下所示。

def call_foo(arg_dict):
    foo(name=arg_dict['name'], a=arg_dict['a'], b=arg_dict['b'], c=arg_dict['c'])
Run Code Online (Sandbox Code Playgroud)

不过,我需要根据这些键是否实际存在于字典中来进行函数调用。因此,如果只有一部分参数存在,我只会传递这些参数。

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'])
Run Code Online (Sandbox Code Playgroud)

这种类型的表达式将很快变得难以管理,因为有大量可选参数。

如何定义要传递给 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)
Run Code Online (Sandbox Code Playgroud)

rob*_*rit 5

您可以使用双星为 kwargs 调用该函数:

def call_foo(arg_dict):
    foo(**arg_dict)
Run Code Online (Sandbox Code Playgroud)

这意味着您可能甚至不需要call_foo开始。

如果您想了解更多关于星号和双星参数如何工作的信息,这篇 StackOverflow 帖子有很多细节。