Поиск по сайту:

Как использовать *args и **kwargs в Python 3


Введение

In-параметры — это именованные сущности, которые указывают аргумент, который может принимать данная функция.

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

Предпосылки

У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас не настроена среда программирования, вы можете обратиться к руководствам по установке и настройке среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.).

Понимание *аргументы

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

Информация: Чтобы следовать примеру кода в этом руководстве, откройте интерактивную оболочку Python в вашей локальной системе, выполнив команду python3. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>.

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

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)

Теперь мы можем запустить приведенный выше код:

  1. python lets_multiply.py

Мы получим следующий вывод, показывающий, что целые числа 5 и 4 были перемножены в соответствии с функцией multiply(x,y):

Output
20

Что, если позже мы решим, что хотим умножить три числа, а не только два? Если мы попытаемся добавить в функцию дополнительное число, как показано ниже, мы получим ошибку.

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

multiply(5, 4, 3)
Output
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)

Когда мы запустим этот код, мы получим продукт для каждого из этих вызовов функций:

Output
20 90 24 900

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

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

Понимание **kwargs

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

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

Во-первых, давайте распечатаем аргументы **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)

Давайте запустим программу выше и посмотрим на вывод:

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

В зависимости от версии Python 3, которую вы сейчас используете, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы будете получать пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.

Важно отметить, что создается словарь с именем kwargs, и мы можем работать с ним точно так же, как мы можем работать с другими словарями.

Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать **kwargs. Здесь мы создадим функцию для приветствия словаря имен. Во-первых, мы начнем со словаря двух имен:

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")

Теперь мы можем запустить программу и посмотреть на результат:

  1. python print_values.py
Output
The value of your_name is Casey The value of my_name is Sammy

Опять же, поскольку словари могут быть неупорядочены, ваш вывод может быть с именем Casey первым или с именем Sammy первым.

Давайте теперь передадим функции дополнительные аргументы, чтобы показать, что **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"
        )

Когда мы запустим программу в этот момент, мы получим следующий вывод, который снова может быть неупорядоченным:

Output
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):
...

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

Использование *args и **kwargs в вызовах функций

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

Во-первых, давайте рассмотрим пример с *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)

args = ("Sammy", "Casey", "Alex")
some_args(*args)

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

Когда мы запустим программу с помощью команды python some_args.py, мы получим следующий вывод:

Output
arg_1: Sammy arg_2: Casey arg_3: Alex

Мы также можем изменить приведенную выше программу на итерируемый именованный параметр:

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)

Если мы запустим программу выше, она выдаст следующий вывод:

Output
arg_1: 1 arg_2: 2 arg_3: 3

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

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:

Output
kwarg_1: Val kwarg_2: Harper kwarg_3: Remy

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

Заключение

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

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