*args, **kwargs

*args, **kwargs

@Pycoders

Думаю, многие хоть раз видели такую запись, сейчас мы узнаем, что это за магические символы. Сообщу заранее, что args и kwargs - общепринятые имена переменных, а разбирать мы будем звездочки перед нимим.

def func(*args, **kwargs):
    # code

*args

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

def add(a, b):
    print(a + b)

add(2, 2)
# Output: 4

Вроде бы всё хорошо, но что если мы захотим сложить не два числа, а три, четыре или даже больше? Вот здесь и понадобится конструкция со звездочкой (по-умному астерикс, а не звездочка). Напоминаю, что вместо args вы можете написать любое другое имя вашей переменной, однако именно args является наиболее популярным вариантом.

Итак, если поставить * в определении функции, то переменная будет принимать не один аргумент, а сколько угодно. Аргументы передаются как кортеж и доступны внутри функции под тем же именем, что и имя параметра, только без *.

def add(*args):
    print(sum(args))

add(2, 2, 5, 7, 4)
# Output: 20

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

nums = [2, 2, 5, 7, 4]
add(*nums)
# Output: 20
Будьте внимательны, при использовании такой конструкции могут возникнуть недопонимания с позиционными аргументами и генераторами.

**kwargs

Здесь ничего особенного, просто упаковка именованных аргументов в словарь.

def func(**kwargs):
    print(kwargs)

func(name='Alan', age=22, male=True)
# Output: {'name': 'Alan', 'age': 22, 'male': True}

Итог

В целом, конструкция с *args, **kwargs получается достаточно полезной, если мы не знаем, кто и в каких целях будет использовать нашу функцию. То есть, мы можем запихнуть в аргументы после такого практически всё.

  • *args для неименованных аргументов;
  • **kwargs для именованных аргументов.




Report Page