Рубрики
Без рубрики

Python * args и ** Kwargs

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

Автор оригинала: Pankaj Kumar.

Аргументы функций Python

Python позволяет нам определить три типа аргументов для функции:

  1. Формальные аргументы, например def добавить (a, b)
  2. Переменное число аргументов без ключевых слов, использующих * args, например Def Добавить (* args)
  3. Переменное количество аргументов ключевых элементов или названные аргументы с использованием ** Kwargs, например Def Добавить (** kwargs) Отказ

Некоторые важные моменты о аргументах функции.

  • Когда мы определяем аргументы функций, заказ должен быть формальным аргументами, а затем * args и ** kwargs.
  • Не обязательно использовать имена args и kwargs, мы можем использовать другие имена. Однако это Конвенция их использовать. Это сделает ваш код легко читать и понять.
  • Переменная ARGS имеет тип кортеж Отказ Мы можем пройти кортеж как аргумент функции для карты с помощью ARGS.
  • Переменная KWargs имеет тип Диктовать Отказ Таким образом, мы можем пройти словарь в качестве аргумента на карту с Kwargs.

Почему нам нужно * args и ** kwargs?

Допустим, у нас есть функция, чтобы добавить два числа:

def add_two_numbers(a, b):
    return a + b

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

def add_three_numbers(a, b, c):
    return a + b + c

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

Пример Python * Args

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

def add(*args):
    total = 0
    for arg in args:
        total = total + arg
    return total


print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 2, 3, 4))

Какой тип * args и ** kwargs?

def zap(*args, **kwargs):
    print(type(args))
    print(type(kwargs))


zap()

Выход:



Python ** Kwargs Пример

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

def kwargs_processor(**kwargs):
    for k, v in kwargs.items():
        print(f'Key={k} and Value={v}')


kwargs_processor(name='Pankaj', age=34)
kwargs_processor(country='India', capital='New Delhi')

Выход:

Key=name and Value=Pankaj
Key=age and Value=34
Key=country and Value=India
Key=capital and Value=New Delhi

Прохождение кортежа и словарь для * args и ** kwargs картирование

Давайте посмотрим, как пройти ценности кортежей на карту с элементами args и словаря к переменной Kwargs.

t = (10, 30, 60)
print(add(*t))

d = {'name': 'Pankaj', 'age': 34}
kwargs_processor(**d)

Выход:

100
Key=name and Value=Pankaj
Key=age and Value=34

Обратите внимание на использование *, используя кортеж, чтобы сопоставить его значения в args. Аналогично, ** используется для отображения элементов диктографических элементов к переменной KWargs.

Когда использовать * args и ** kwargs

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

Имитация функционального ответа с * args и ** kwargs

Допустим, у нас есть класс API, определенный так:

class APIHelper:

    def call_api(self, url, input_json):
        # some complex logic
        return 'complex_response_data'

Мы можем создать функцию тестирования симулятора и отображать ее в функцию API для создания тестового ответа.

class MyTestClass:

    def test_call_api(self, *args, **kwargs):
        return "test_response_data"

# Assign API function to use our test function
APIHelper.call_api = MyTestClass.test_call_api

Давайте посмотрим, что произойдет, когда мы используем наши функции API сейчас.

ah = APIHelper()
print(ah.call_api())
print(ah.call_api(1, url='https://www.journaldev.com', input_json={}))
print(ah.call_api(1, 2, url='https://www.journaldev.com'))

Выход:

test_response_data
test_response_data
test_response_data

Функция декоратора для * args и ** kwargs

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

def log_arguments(func):
    def inner(*args, **kwargs):
        print(f'Arguments for args:{args}, kwargs:{kwargs}')
        return func(*args, **kwargs)

    return inner

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

@log_arguments
def foo(x, y, z):
    return x + y + z


sum_ints = foo(1, 2, z=5)
print(sum_ints)


@log_arguments
def bar(x, *args, **kwargs):
    total = x
    for arg in args:
        total = total + arg
    for key, value in kwargs.items():
        total = total + value
    return total


sum_ints = bar(1, 2, 3, a=4, b=5)
print(sum_ints)

Выход:

Arguments for args:(1, 2), kwargs:{'z': 5}
8
Arguments for args:(1, 2, 3), kwargs:{'a': 4, 'b': 5}
15