相关疑难解决方法(0)

使用*args,**kwargs和optional/default参数调用Python函数

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

def func(kw1=None,kw2=None,**kwargs):
   ...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以调用func作为:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)
Run Code Online (Sandbox Code Playgroud)

我也可以定义一个函数:

def func(arg1,arg2,*args):
    ...
Run Code Online (Sandbox Code Playgroud)

可称为

func(3,4,additional,arguments,go,here,Ellipsis)
Run Code Online (Sandbox Code Playgroud)

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

def func(arg1,arg2,*args,**kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

但是,什么是行不通的是:

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

我最初的想法是,这可能是因为一个功能

def func(arg1,arg2,*args,kw1=None):
    ...
Run Code Online (Sandbox Code Playgroud)

可以称为

func(1,2,3) #kw1 will be assigned 3
Run Code Online (Sandbox Code Playgroud)

因此,这将引入一些含糊不清的关于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)
   ...
Run Code Online (Sandbox Code Playgroud)

有了这个,似乎没有语法模糊:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...
Run Code Online (Sandbox Code Playgroud)

但是,这仍然会导致语法错误(使用Python3.2测试).这是否有理由让我失踪?并且,有没有办法获得我上面描述的行为(使用默认参数*args) - 我知道我可以通过操作函数内部的kwargs字典来模拟该行为.

python syntax kwargs python-3.x

59
推荐指数
3
解决办法
3万
查看次数

标签 统计

kwargs ×1

python ×1

python-3.x ×1

syntax ×1