На этом шаге мы приведем общие сведения по этим параметрам.
Нужно сказать, что сколько бы ни потешались над параметрами *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. Фактическим синтаксисом является, соответственно, просто звездочка (*) или двойная звездочка (**).
Однако чтобы избежать недоразумений, рекомендуем придерживаться общеринятого согласованного правила именования.
На следующем шаге мы рассмотрим переадресацию необязательных или именованных аргументов.