Сообщить об ошибке.

Переменные аргументов *args и **kwargs в функции Python

Передача произвольного числа аргументов в функцию Python

Наконец, наименее часто используемая опция, это когда функция вызываться с произвольным числом аргументов. Обычно они указываются последними в списке формальных параметров, потому что собирают все оставшиеся входные аргументы, которые передаются в функцию.

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

  • *args - произвольное число позиционных аргументов. При вызове функции, на место этого параметра передается список аргументов, заключенных в кортеж. Перед *args может быть ноль или более нормальных аргументов. Любые формальные параметры, которые появляются после параметра *args, являются аргументами "только для ключевых слов". Это означает, что следующие за *args параметры могут использоваться только как ключевые аргументы, а не как позиционные.
  • **kwargs - произвольное число именованных аргументов. При вызове функции, на его место передается список именованных аргументов заключенных в словарь, кроме тех, имена которых были определены ранее. Параметр **kwargs может быть определен совместно с другим формальным параметром *args. Параметр **kwargs указывается последним в области определения формальных параметров функции.

Примечание: один символ * в имени параметра функции args распаковывает список или кортеж для передачи позиционных аргументов, а два символа ** в имени параметра функции **kwargs распаковывает словарь для передачи ключевых аргументов в функцию при ее вызове.

Имена *args и **kwargs по негласному соглашению принято использовать в документации Python. На самом деле никто не запрещает брать любые другие имена переменных. Например, для словарей наряду c **kwargs иногда используют **options.

Пример использования *args:

def chees(*arguments):
    for arg in arguments:
        print(arg)

word = ("It's very runny, sir.",
        "It's really very.", 
        "VERY runny, sir.")

chees(*word)
# Выведет
It's very runny, sir.
It's really very. 
VERY runny, sir.

Пример использования **kwargs:

def shop(**keywords):
    for kw in keywords:
        print(kw, ":", keywords[kw])

kword = {shopkeeper:"Michael Palin",
        client:"John Cleese",
        sketch:"Cheese Shop Sketch"}

shop(**kword)
# Выведет
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch

Распаковку можно использовать несколько раз. На примере словаря:

def process_data(a, b, c, d):
    print(a, b, c, d)

x = {'a': 1, 'b': 2}
y = {'c': 3, 'd': 4}

process_data(**x, **y)
1 2 3 4

process_data(**x, c=23, d=42)
1 2 23 42

Пример совместного использования *args и **kwargs:

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

Функцию cheeseshop можно вызвать так:

word = ("It's very runny, sir.",
        "It's really very.", 
        "VERY runny, sir.")
kword = {shopkeeper:"Michael Palin",
        client:"John Cleese",
        sketch:"Cheese Shop Sketch"}

cheeseshop("Limburger", *word, **kword)

и, конечно, функция выведет:

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very. 
VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch