使用*args、**kwargs和可选/默认参数调用Python函数

2024-10-02 14:30:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,我可以定义如下函数:

def func(kw1=None,kw2=None,**kwargs):
   ...

在这种情况下,我可以将func称为:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

我还可以将函数定义为:

def func(arg1,arg2,*args):
    ...

可以称为

func(3,4,additional,arguments,go,here,Ellipsis)

最后,我可以把这两种形式结合起来

def func(arg1,arg2,*args,**kwargs):
    ...

但是,不起作用的是:

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in python 2 only,  apparently this works in python 3)
    ...

我最初的想法是这可能是因为

def func(arg1,arg2,*args,kw1=None):
    ...

可以称为

func(1,2,3) #kw1 will be assigned 3

因此,这将引入一些关于3是否应该打包成args或kwargs的模糊性。但是,对于python 3,可以指定仅关键字的参数:

def func(a,b,*,kw=None):  #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
   ...

因此,似乎不存在以下语法歧义:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

但是,这仍然会导致语法错误(使用Python3.2测试)。我失踪的原因是什么?还有,有没有办法得到我上面描述的行为(有带默认参数的*args)——我知道我可以通过在函数中操作kwargs字典来模拟这种行为。


Tags: 函数none定义defargsbethiswill
2条回答

你可以在Python 3中实现这一点。

def func(a,b,*args,kw1=None,**kwargs):

仅当要指定仅关键字参数而不接受具有*args的可变数量的位置参数时,才使用裸*。你不用两个*s

引用语法,在Python 2中,您有

parameter_list ::=  (defparameter ",")*
                    (  "*" identifier [, "**" identifier]
                    | "**" identifier
                    | defparameter [","] )

Python 3期间,您有

parameter_list ::=  (defparameter ",")*
                    (  "*" [parameter] ("," defparameter)*
                    [, "**" parameter]
                    | "**" parameter
                    | defparameter [","] )

其中包括在*参数之后提供附加参数。

更新:

最新的Python 3文档here

如果要同时执行这两个操作,请记住,*args和**kwargs必须是最后指定的参数。

def func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #Invalid
def func(arg1,arg2,kw1=None,kw2=None,*args,**kwargs): #Valid

这些注释似乎是基于混淆了函数定义的构造方式,而不是将提供的参数重新分配给定义中指定的参数。

这是这个函数的定义,它有6个参数。 通过在函数调用中将命名和未命名参数传递给它来调用它。

对于这个例子。。。 当参数在调用函数时被命名时,它可以被无序地提供。 arg1和arg2是必需参数,如果未作为命名参数传递给函数,则必须根据提供的未命名参数按顺序分配它们。 kw1和kw2在函数定义中提供了默认值,因此它们不是必需的,但是如果没有提供命名参数,它们将从其余提供的未命名参数中获取任何可用值。 剩余的任何未命名参数都提供给名为args的数组中的函数 任何在函数定义中没有相应参数名的命名参数都提供给名为kwargs的字典中的函数调用。

相关问题 更多 >