小编典典

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

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字典来模拟这种行为。


阅读 248

收藏
2020-12-20

共1个答案

小编典典

可以 在Python 3中做到这一点。

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

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

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

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

而在Python
3中

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

其中包括在参数之后提供其他参数的规定*

更新:

最新的Python
3文档在这里

2020-12-20