在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字典来模拟这种行为。
你可以在Python 3中实现这一点。
仅当要指定仅关键字参数而不接受具有
*args
的可变数量的位置参数时,才使用裸*
。你不用两个*
s引用语法,在Python 2中,您有
在Python 3期间,您有
其中包括在
*
参数之后提供附加参数。更新:
最新的Python 3文档here。
如果要同时执行这两个操作,请记住,*args和**kwargs必须是最后指定的参数。
这些注释似乎是基于混淆了函数定义的构造方式,而不是将提供的参数重新分配给定义中指定的参数。
这是这个函数的定义,它有6个参数。 通过在函数调用中将命名和未命名参数传递给它来调用它。
对于这个例子。。。 当参数在调用函数时被命名时,它可以被无序地提供。 arg1和arg2是必需参数,如果未作为命名参数传递给函数,则必须根据提供的未命名参数按顺序分配它们。 kw1和kw2在函数定义中提供了默认值,因此它们不是必需的,但是如果没有提供命名参数,它们将从其余提供的未命名参数中获取任何可用值。 剩余的任何未命名参数都提供给名为args的数组中的函数 任何在函数定义中没有相应参数名的命名参数都提供给名为kwargs的字典中的函数调用。
相关问题 更多 >
编程相关推荐