Режимы сопоставления аргументов функции в 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 шт):

Автор решения: Сергей

Правила перечисления аргументов в вызове функции таковы:

  1. позиционные аргументы, идущие друг за другом;
  2. *args - итерируемая последовательность позиционых аргументов;
  3. ключевые аргументы (значения по умолчанию);
  4. **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. "Режимы сопоставления аргументов функции".

→ Ссылка