Автор оригинала: Pankaj Kumar.
Аргументы функций Python
Python позволяет нам определить три типа аргументов для функции:
- Формальные аргументы, например
def добавить (a, b) - Переменное число аргументов без ключевых слов, использующих * args, например
Def Добавить (* args) - Переменное количество аргументов ключевых элементов или названные аргументы с использованием ** 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