Функция python * args и ** kwargs с другими указанными аргументами ключевого слова
У меня есть класс Python с методом, который должен принимать аргументы и аргументы ключевых слов таким образом
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>
при вызове:
plt = plot(x, y)
plt.set_axis("test1", "test2", xlabel="new_x", my_kwarg="test3")
Я получаю ошибку: TypeError: set_axis() got multiple values for keyword argument 'xlabel'
В любом случае, если я устанавливаю свой метод как
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>
и вызовите:
plt = plot(x, y)
plt.set_axis(xlabel="new_x", "test1", "test2", my_kwarg="test3")
Я получаю SyntaxError: non-keyword arg after keyword arg
, как и ожидал.
Что не так с первым случаем? Как мне сообщить моему методу принять любой аргумент пользователя и аргумент ключевого слова, отличные от стандартных? (Надеюсь, мой вопрос достаточно ясен)
Ответы
Ответ 1
Вы использовали бы другой шаблон:
def set_axis(self, *args, **kwargs):
xlabel = kwargs.get('xlabel', 'x')
ylabel = kwargs.get('ylabel', 'y')
Это позволяет использовать * и **, сохраняя резервные значения, если аргументы ключевого слова не определены.
Ответ 2
В Python 3 это работает:
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'}
>>>
Ответ 3
Вот небольшая tweek для Jure C. ответ:
def set_axis(self, *args, **kwargs):
xlabel = kwargs.pop('xlabel', 'x')
ylabel = kwargs.pop('ylabel', 'y')
Я изменил get
на pop
, чтобы удалить xlabel
и ylabel
из kwargs
, если он есть. Я сделал это, потому что остальная часть кода в исходном вопросе содержит цикл, который предназначен для итерации через все kwargs
, за исключением xlabel
и ylabel
.