1

假设您有这样的功能:

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
4

2 回答 2

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 中,通过在参数var1添加through来支持这一点:var3 *multi_values

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

This does basically the same as the previous example, with the additional advantage of better introspection.

于 2012-08-13T18:01:07.920 回答
3

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

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

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

example(var4="something")
于 2012-08-13T18:00:16.720 回答