Шаг 51.
Python: тонкости программирования.
Эффективные функции. Параметры *args и **kwargs (общие сведения)

    На этом шаге мы приведем общие сведения по этим параметрам.

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

    Итак, для чего же используются параметры *args и **kwargs? Они позволяют функции принимать необязательные аргументы, благодаря чему вы можете создавать гибкие API в модулях и классах:

>>> def foo(required, *args, **kwargs):
	print(required)
	if args:
		print(args)
	if kwargs:
		print(kwargs)

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

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

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

    Как args, так и kwargs могут быть пустыми, если никакие дополнительные аргументы в функцию не переданы.

    Когда мы вызываем функцию с различными комбинациями аргументов, вы видите, как Python собирает их в параметрах args и kwargs в соответствии с тем, являются они позиционными или именованными аргументами:

>>> foo()
Traceback (most recent call last):
TypeError: foo() missing 1 required positional argument: 'required'
>>> foo('привет')
привет
>>> foo('привет', 1, 2, 3)
привет
(1, 2, 3)
>>> foo('привет', 1, 2, 3, key1='значение', key2=999)
привет
(1, 2, 3)
{'key1': 'значение', 'key2': 999}

    Сразу проясним. Название параметров args и kwargs принято по договоренности, как согласованное правило именования. Приведенный выше пример будет работать точно так же, если вы назовете их *parms и **argv. Фактическим синтаксисом является, соответственно, просто звездочка (*) или двойная звездочка (**).

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

    На следующем шаге мы рассмотрим переадресацию необязательных или именованных аргументов.




Предыдущий шаг Содержание Следующий шаг