Chamando uma função Python com * args, ** kwargs e argumentos opcionais / padrão
Em python, posso definir uma função da seguinte maneira:
def func(kw1=None,kw2=None,**kwargs):
...
Nesse caso, eu posso chamar func como:
func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)
Também posso definir uma função como:
def func(arg1,arg2,*args):
...
que pode ser chamado como
func(3,4,additional,arguments,go,here,Ellipsis)
Finalmente, eu posso combinar as duas formas
def func(arg1,arg2,*args,**kwargs):
...
Mas, o que não funciona é chamar:
func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #SYNTAX ERROR (in python 2 only, apparently this works in python 3)
...
Meu pensamento original era que isso provavelmente se devia a uma função
def func(arg1,arg2,*args,kw1=None):
...
pode ser chamado como
func(1,2,3) #kw1 will be assigned 3
Então, isso introduziria alguma ambiguidade quanto ao fato de 3 serem empacotados em args ou kwargs. No entanto, no python 3, é possível especificar argumentos apenas de palavras-chave:
def func(a,b,*,kw=None): #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
...
Com isso, parece que não há ambiguidade sintática com:
def func(a,b,*args,*,kw1=None,**kwargs):
...
No entanto, isso ainda gera um erro de sintaxe (testado com Python3.2). Existe uma razão para isso que estou perdendo? E existe uma maneira de obter o comportamento descrito acima (Tendo * args com argumentos padrão) - eu sei que posso simular esse comportamento manipulando o dicionário kwargs dentro da função.