最佳答案
在 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
。但是,对于 Python3,只能指定关键字参数:
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
字典来模拟这种行为。