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.

questionAnswers(4)

yourAnswerToTheQuestion