función de python * args y ** kwargs con otros argumentos de palabras clave especificados

Tengo una clase de Python con un método que debería aceptar argumentos y argumentos de palabras clave de esta manera

class plot: def __init__(self, x, y): self.x = x self.y = y def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): for arg in args:  for key in kwargs:  

al llamar:

 plt = plot(x, y) plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3") 

Me sale el error: TypeError: set_axis() got multiple values for keyword argument 'xlabel'

De todos modos si configuro mi método como

 class plot: def __init__(self, x, y): self.x = x self.y = y def set_axis(self, xlabel="x", ylabel="y", *args, **kwargs): for arg in args:  for key in kwargs:  

y llama:

 plt = plot(x, y) plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3") 

Me sale SyntaxError: non-keyword arg after keyword arg , como esperaba. ¿Qué hay de malo en el primer caso? ¿Cómo debo indicar a mi método que acepte cualquier argumento de usuario y argumento de palabra clave, que no sean los predeterminados? (Espero que mi pregunta sea lo suficientemente clara)

Usarías un patrón diferente:

 def set_axis(self, *args, **kwargs): xlabel = kwargs.get('xlabel', 'x') ylabel = kwargs.get('ylabel', 'y') 

Esto le permite usar * y ** mientras mantiene los valores de respaldo si no se definen los argumentos de palabras clave.

En Python 3 esto funciona:

 Python 3.2.3 (default, Oct 19 2012, 19:53:16) >>> def set_axis(self, *args, xlabel="x", ylabel="y", **kwargs): ... print(args, xlabel, ylabel, kwargs) ... >>> set_axis(None, "test1", "test2", xlabel="new_x", my_kwarg="test3") ('test1', 'test2') new_x y {'my_kwarg': 'test3'} >>> 

Aquí hay un ligero cambio en la respuesta de Jure C.

 def set_axis(self, *args, **kwargs): xlabel = kwargs.pop('xlabel', 'x') ylabel = kwargs.pop('ylabel', 'y') 

xlabel ylabel de hacer pop para eliminar xlabel y ylabel de kwargs si están presentes. Hice esto porque el rest del código en la pregunta original contiene un bucle que está destinado a recorrer todos los kwargs excepto xlabel y ylabel .