Режимы сопоставления аргументов функции в python. Использование *args и **kwargs
Подскажите пожалуйста, как можно использовать *args и **kwargs в python. Вопросы следующие: Если имеется функция, в которой имеются позиционные аргументы и *args
def function(first, second, *args):
то как мне правильно вызвать её в том случае, если я хочу их присваивать как именованные:
function(234, first=123, second=444)
В данном случае я хочу задать аргументы указывая какой есть какой, но в таком случае при попытке прописать остальные данные в *args получаю ошибку
TypeError: function() got multiple values for argument 'first'
Как правильно совместить использование *args и именованных аргументов на подобном примере, возможно ли это.
Например я хочу задать
def function(first, second, *args, **kwargs):
В таком случае, могу ли я использовать что-то подобное?
function(234, first=123, second=444, third=3)
Заранее спасибо.
Ответы (1 шт):
Правила перечисления аргументов в вызове функции таковы:
- позиционные аргументы, идущие друг за другом;
- *args - итерируемая последовательность позиционых аргументов;
- ключевые аргументы (значения по умолчанию);
- **kwargs - словарь ключевых аргументов.
Соответственно, если вы используете:
def function(first, second, *args, **kwargs):,
то сначала у вас должны идти позиционные агрументы first и second.
Компилятор совершенно правильно сообщает вам, что в варианте
function(234, first=123, second=444, third=3) у вас два параметра (234 и 123) на один аргумент first.
Более того, даже я, будучи человеком, не могу понять, что такое параметр 234 тут? Он не подпадает под описанные вами аргументы. Если это *args, то при таком описании, как выше, правильно вызывать:
function(123, 444, 3, 234)
Пример:
def function(first, second, *args):
print ('first:', first, 'second:', second, '*args', args)
function(123, 444, 3, 234) # Печатает: first: 123 second: 444 *args: (3, 234)
Аналогично и для def function(first, second, *args, **kwargs):.
Возможно, вы несколько путаете параметры и аргументы. Например, обратите внимание, что ваш вопрос ниже просто противоречив. Вы говорите про "именованные аргументы", но далее в определении функции никакие именованные аргументы вы не указываете, у вас сразу за *args идут **kwargs:
Начало цитаты:
"Как правильно совместить использование *args и именованных аргументов на подобном примере, возможно ли это.
Например я хочу задать
def function(first, second, *args, **kwargs):"
Конец цитаты.
Рекомендую почитать учебник Чернышова "Основы программирования на Python":
3.2.1. "Значения аргументов по умолчанию",
3.2.2. "Режимы сопоставления аргументов функции".