Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python function *args and **kwargs with other specified keyword arguments

I have a Python class with a method which should accept arguments and keyword arguments this way

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:
            <do something>
        for key in kwargs:
             <do somethng else>

when calling:

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

I get the error: TypeError: set_axis() got multiple values for keyword argument 'xlabel'

Anyway if I set my method like

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:
            <do something>
        for key in kwargs:
             <do somethng else>

and call:

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

I get SyntaxError: non-keyword arg after keyword arg, as I was expecting. What is wrong with the first case? How should I tell my method to accept any user argument and keyword argument, other than the default ones? (Hope my question is clear enough)

like image 852
fmonegaglia Avatar asked Dec 22 '12 15:12

fmonegaglia


1 Answers

In Python 3 this works:

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'}
>>> 
like image 154
warvariuc Avatar answered Sep 23 '22 05:09

warvariuc