• 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

Я уверен, что вы можете придумать и другие варианты использования.