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

时间:2012-08-13 17:56:17

标签: python python-2.x

假设你有这样的功能:

def example(var1=None,var2=None,var3=None,*multi_values):
    print (var1,var2,var3,*multi_values)

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

示例:

>>> multi=range(3)
>>> example(???)
(None,"hi",None,(1,2,3))

我不想这样做:

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

2 个答案:

答案 0 :(得分:6)

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

def example(var1=None, var2=None, var3=None, multi_values=None):
    if multi_values is None:
        multi_values = []
    # whatever

然后你可以把这个函数称为

example(multi_values=multi)

另一种选择是仅通过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

在Python 3.x中,在{/ 1}} var1参数之后通过var3 添加*multi_values来支持此功能:

def example(*multi_values, var1=None, var2=None, var3=None):
    # whatever

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

答案 1 :(得分:3)

没有。您必须在* args值之前提供所有命名值。

但是,您可以使用** kwargs来获取其他命名参数。

def example(var1=None,var2=None,var3=None,**kwargs):

example(var4="something")