如何在同一个函数调用中使用可选的命名参数和*mulit_vars?

eri*_*ork 1 python python-2.x

假设你有这样的功能:

def example(var1=None,var2=None,var3=None,*multi_values):
    print (var1,var2,var3,*multi_values)
Run Code Online (Sandbox Code Playgroud)

你可以绕过调用所有可选参数,只是添加到最后一个?

例:

>>> multi=range(3)
>>> example(???)
(None,"hi",None,(1,2,3))
Run Code Online (Sandbox Code Playgroud)

我不想这样做:

>>> multi=range(3)
>>> example(None,None,None,*multi) #bad -> this doesn't use the default values
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 6

一种选择是将原型更改为可迭代的multi_values参数,而不是接受任意数量的参数:

def example(var1=None, var2=None, var3=None, multi_values=None):
    if multi_values is None:
        multi_values = []
    # whatever
Run Code Online (Sandbox Code Playgroud)

然后你可以把函数称为

example(multi_values=multi)
Run Code Online (Sandbox Code Playgroud)

另一种选择是仅var1通过var3关键字参数接受:

def example(*multi_values, **kwargs):
    var1 = kwargs.pop("var1", None)
    var2 = kwargs.pop("var2", None)
    var3 = kwargs.pop("var3", None)
    if kwargs:
        raise TypeError("Unknown keyword arguments")
    # whatever
Run Code Online (Sandbox Code Playgroud)

在Python 3.x中,这是通过将支持var1通过var3 *multi_values说法:

def example(*multi_values, var1=None, var2=None, var3=None):
    # whatever
Run Code Online (Sandbox Code Playgroud)

这与前一个示例基本相同,具有更好内省的额外优势.