en Python, puedo definir una función de la siguiente manera:Llamar a una función de Python con args *, ** y kwargs opcional/por defecto argumentos
def func(kw1=None,kw2=None,**kwargs):
...
En este caso, puedo llamar a func como:
func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)
I también puede definir una función como:
def func(arg1,arg2,*args):
...
que puede ser llamado como
func(3,4,additional,arguments,go,here,Ellipsis)
Por último, puedo combinar las dos formas
def func(arg1,arg2,*args,**kwargs):
...
Pero, lo que no funciona está llamando:
func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #SYNTAX ERROR (in python 2 only, apparently this works in python 3)
...
Mi idea original era que esto era probablemente debido a una función
def func(arg1,arg2,*args,kw1=None):
...
se puede llamar como
func(1,2,3) #kw1 will be assigned 3
Así que esto introduciría cierta ambigüedad en cuanto a si 3 deben ser empacados en args o kwargs. Sin embargo, con el pitón 3, existe la posibilidad de especificar la palabra clave únicos argumentos:
def func(a,b,*,kw=None): #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
...
Con esto, parece que no hay ambigüedad sintáctica con:
def func(a,b,*args,*,kw1=None,**kwargs):
...
Sin embargo, esto todavía aparece una error de sintaxis (probado con Python3.2). ¿Hay alguna razón para esto que me estoy perdiendo? Y, ¿hay alguna manera de obtener el comportamiento que describí anteriormente (Tener * args con argumentos predeterminados)? Sé que puedo simular ese comportamiento manipulando el diccionario kwargs dentro de la función.
no tengo idea de por qué tienes un error de sintaxis para "def func (arg1, arg2, * args, kw1 = None, kw2 = None, ** kwargs):" – okm
@okm Porque no probé esa versión en python 3 , solo Python 2. Simplemente asumí que la versión final funcionaría, y cuando no lo hizo, asumí que las versiones anteriores tampoco funcionarían. ¡Gracias!. – mgilson
¿Cómo debería un '3' desnudo meterse en' kwargs'? ¿Qué palabra clave usaría? No puedo ver ninguna ambigüedad. Tenga en cuenta que el '' 'desnudo en la lista de argumentos solo es útil si no hay' * args'. Es un marcador de posición que usa * en su lugar * de '* args'. –