- en
- Language: ru
- Documentation version: latest
1. *args и **kwargs¶
Я убедился, что большинству начинающих программистов на Python трудно разобраться с магическими переменными *args и **kwargs. Так что же это такое? Прежде всего, позвольте мне сказать вам, что нет необходимости писать *args или **kwargs. Необходимо только *
(звездочка). Вы также могли бы написать *var и **vars. Написание *args и **kwargs - это просто условность. Итак, давайте сначала рассмотрим *args.
1.1. Использование *args¶
*args и **kwargs в основном используются в определениях функций. *args и **kwargs позволяют передавать неопределенное количество аргументов в функцию, поэтому при написании определения функции вам не нужно знать, сколько аргументов будет передано в вашу функцию. *args используется для передачи функции без ключевых слов списка аргументов переменной длины. Вот пример, который поможет вам получить ясное представление:
def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')
Это дает следующий результат:
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
Надеюсь, что это прояснило все ваши сомнения. Итак, теперь давайте поговорим о **кваргах
1.2. Использование **kwargs¶
**kwargs позволяет передавать ключевые слова переменной длины аргументов в функцию. Вам следует использовать **kwargs, если вы хотите обрабатывать именованные аргументы в функции. Вот пример, который поможет вам в этом:
def greet_me(**kwargs):
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
>>> greet_me(name="yasoob")
name = yasoob
Итак, вы видите, как мы обработали список аргументов с ключевыми словами в нашей функции. Это только основы **kwargs, и вы можете видеть, насколько они полезны. Теперь давайте поговорим о том, как можно использовать *args и **kwargs для вызова функции со списком или словарем аргументов.
1.3. Использование *args и **kwargs для вызова функции¶
Итак, здесь мы рассмотрим, как вызвать функцию, используя *args и **kwargs. Просто представьте, что у вас есть эта маленькая функция:
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
Теперь вы можете использовать *args или **kwargs для передачи аргументов этой маленькой функции. Вот как это сделать:
# first with *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
Очередность использования *args **kwargs и формальных args.
Итак, если вы хотите использовать в функциях все эти три параметра, то порядок следующий
some_func(fargs, *args, **kwargs)
1.4. Когда их использовать?¶
Это действительно зависит от ваших требований. Чаще всего его используют при создании декораторов функций (об этом в другой главе). Кроме того, его можно использовать и для обезьяньего исправления. Обезьянье исправление означает изменение некоторого кода во время выполнения. Рассмотрим, что у вас есть класс с функцией get_info
, которая вызывает API и возвращает данные ответа. Если мы хотим протестировать ее, мы можем заменить вызов API некоторыми тестовыми данными. Например:
import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info
Я уверен, что вы можете придумать и другие варианты использования.