Использование *args и **kwargs в Python 3

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

Читайте также: Определение функций в Python 3

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

Что такое *args?

В Python параметр *args используется для передачи списка аргументов переменной длины без указания ключевого слова. Стоит отметить, что звездочка (*) является важным элементом параметра, так как слово args – установленная условная идиома.

Рассмотрим типичную функцию, которая использует два аргумента (файл lets_multiply.py):

def multiply(x, y):
print (x * y)

В этом примере функция использует x и y в качестве аргументов. Далее, при вызове функции, нужно использовать числа, соответствующие x и y. Передайте целые числа: 5 для x и 4 для y:

def multiply(x, y):
print (x * y)
multiply(5, 4)

Запустите код:

python lets_multiply.py

Вы получите результат функции multiply(x,y) с заданными значениями:

20

К примеру, теперь нужно умножить три числа, а не два. Если вы попытаетесь добавить в функцию ещё одно число (как показано ниже), вы получите сообщение об ошибке.

def multiply(x, y):
print (x * y)
multiply(5, 4, 3)
TypeError: multiply() takes 2 positional arguments but 3 were given

Если вы предполагаете, что в дальнейшем может понадобиться использовать больше аргументов, вы можете применить *args.

Так можно создать ту же функцию, что и в первом примере, но вместо x и y использовать *args.

def multiply(*args):
z = 1
for num in args:
z *= num
print(z)
multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)

Запустите код, вы увидите:

20
90
24
900

Поскольку список аргументов переменной длины был отправлен с помощью *args, вы можете передавать функции любое количество аргументов.

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

Что такое **kwargs?

Параметр **kwargs передаёт функции словарь аргументов переменной длины с ключевым словом.

Примечание: Опять же, звездочки (**) важны, поскольку без них kwargs используется в документации.

Как и *args, **kwargs может принимать любое количество аргументов. Однако **kwargs отличается от *args тем, что требует присваивать ключевое слово.

Для примера создайте простую программу print_kwargs.py. Попробуйте просто вывести аргументы **kwargs, переданные функции.

def print_kwargs(**kwargs):
print(kwargs)

Вызовите функцию с аргументами и ключевыми словами.

def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

Запустите эту программу:

python print_kwargs.py
{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}

Поскольку словарь является неупорядоченным типом данных, пары «ключ-значение» выводятся в случайном порядке. Работать со словарем **kwargs можно так же, как и с другими словарями.

Создайте другую простую программу print_values.py, чтобы научиться работать с **kwargs. Поместите в файл функцию, которая будет выводить на экран приветствие и подставлять имя пользователя.

def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(my_name="8host", your_name="Casey")

Запустите программу:

python print_values.py
The value of your_name is Casey
The value of my_name is 8host

Теперь передайте функции дополнительные аргументы (чтобы убедиться, что **kwargs может принимать любое количество аргументов).

def print_values(**kwargs):
for key, value in kwargs.items():
print("The value of {} is {}".format(key, value))
print_values(
name_1="Alex",
name_2="Gray",
name_3="Harper",
name_4="Phoenix",
name_5="Remy",
name_6="Val"
)

Теперь программа вернёт такой неупорядоченный вывод:

The value of name_2 is Gray
The value of name_6 is Val
The value of name_4 is Phoenix
The value of name_5 is Remy
The value of name_3 is Harper
The value of name_1 is Alex

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

Порядок аргументов

Аргументы должны идти в следующем порядке:

  1. Позиционные аргументы
  2. * арг
  3. Аргументы ключевых слов
  4. ** kwargs

На практике при работе с позиционными параметрами наряду с * args и ** kwargs функция будет выглядеть так:

def example(arg_1, arg_2, *args, **kwargs):
...

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

def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):

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

*args и **kwargs в вызовах функций

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

Создайте файл some_args.py. Рассмотрим такой код (поместите его в новый файл):

def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
args = ("8host", "Casey", "Alex")
some_args(*args)

В функции есть три параметра: arg_1, arg_2 и arg_3. Функция выведет каждый из этих аргументов. Затем мы создаем переменную, которой присваивается итерируемый тип (в данном случае кортеж). Эту переменную можно передать в функцию с помощью звездочки.

Читайте также: Кортежи в Python 3

Запустите программу:

python some_args.py
arg_1: 8host
arg_2: Casey
arg_3: Alex

Также можно изменить эту программу и заменить кортеж другим итерируем типом (например, списком). Также нужно объединить * args с именованным параметром:

def some_args(arg_1, arg_2, arg_3):
print("arg_1:", arg_1)
print("arg_2:", arg_2)
print("arg_3:", arg_3)
my_list = [2, 3] some_args(1, *my_list)

Читайте также: Работа со списками в Python 3

Запустите программу. Вывод:

arg_1: 1
arg_2: 2
arg_3: 3

Аргументы с ключевым словом ** kwargs могут использоваться для вызова функции аналогичным образом. В файле some_kwargs.py создайте переменную, присвойте ей словарь с тремя парами «ключ-значение» (здесь используется kwargs, но его можно вызывать как угодно) и передайте её функции с тремя аргументами:

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
print("kwarg_1:", kwarg_1)
print("kwarg_2:", kwarg_2)
print("kwarg_3:", kwarg_3)
kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)

Запустите программу:

python some_kwargs.py
kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy

Заключение

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

Функции с *args и **kwargs лучше всего использовать в ситуациях, когда количество входных данных в списке аргументов останется относительно небольшим. Использование *args и **kwargs обеспечивает гибкость и читабельность кода, но работать с этим синтаксисом нужно очень внимательно.

Tags: , ,

Добавить комментарий