variable - varargs python




funzione python*args e** kwargs con altri argomenti chiave specificati (2)

Ho una classe Python con un metodo che dovrebbe accettare argomenti e argomenti di parole chiave in questo modo

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>

quando si chiama:

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

Ottengo l'errore: TypeError: set_axis() got multiple values for keyword argument 'xlabel'

Ad ogni modo se ho impostato il mio metodo come

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>

e chiama:

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

Ottengo SyntaxError: non-keyword arg after keyword arg , come mi aspettavo. Cosa c'è di sbagliato nel primo caso? Come dovrei dire al mio metodo di accettare qualsiasi argomento utente e argomento di parole chiave, oltre a quelli predefiniti? (Spero che la mia domanda sia abbastanza chiara)


Dovresti usare un modello diverso:

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

Ciò consente di utilizzare * e ** mantenendo i valori di fallback se gli argomenti della parola chiave non sono definiti.


In Python 3 funziona così:

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'}
>>> 




kwargs