Введение
В этой лабораторной работе вы узнаете о *args и **kwargs в Python. Эти специальные синтаксические конструкции могут показаться устрашающими на первый взгляд, но их довольно легко понять, и они предоставляют мощный способ сделать ваши функции более гибкими. Вы научитесь определять функции, которые могут принимать переменное количество аргументов, что является распространенной и полезной функцией во многих программах и библиотеках Python.
Args и Kwargs
На этом шаге вы изучите базовый синтаксис *args и **kwargs. Они используются в определениях функций, чтобы разрешить передачу неопределенного количества аргументов. *args предназначен для неименованных, позиционных аргументов, в то время как **kwargs предназначен для именованных аргументов (keyword arguments).
Примечание: Если вы не знакомы с использованием WebIDE (похожего на VS Code), пожалуйста, изучите это в этой лаборатории.
Сначала давайте посмотрим, как определить функцию, которая может принимать любую комбинацию аргументов. В проводнике файлов слева найдите файл main.py, расположенный в каталоге ~/project, и откройте его в редакторе.
Добавьте следующий код в main.py:
## Define a function that accepts any number of positional and keyword arguments
def some_function(*args, **kwargs):
print("This function can accept any arguments.")
print(f"Received positional arguments: {args}")
print(f"Received keyword arguments: {kwargs}")
print("-" * 20)
## Call with any number of positional arguments
some_function('arg1', 'arg2', 'arg3')
## Call with any number of keyword arguments
some_function(key1='arg1', key2='arg2', key3='arg3')
## Call with both positional and keyword arguments
some_function('positional_arg', key1='keyword_arg')
## Or call with no arguments at all
some_function()
Важно отметить, что args и kwargs — это всего лишь соглашения об именовании. Одиночная звездочка (*) и двойная звездочка (**) — это фактический синтаксис, который выполняет работу. Однако следование этому соглашению считается хорошей практикой в сообществе Python.
Теперь запустите скрипт, открыв терминал в WebIDE и выполнив следующую команду:
python3 main.py
Вы должны увидеть следующий вывод, демонстрирующий, как функция обрабатывает различные вызовы:
This function can accept any arguments.
Received positional arguments: ('arg1', 'arg2', 'arg3')
Received keyword arguments: {}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {'key1': 'arg1', 'key2': 'arg2', 'key3': 'arg3'}
--------------------
This function can accept any arguments.
Received positional arguments: ('positional_arg',)
Received keyword arguments: {'key1': 'keyword_arg'}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {}
--------------------
Это показывает, что *args собирает позиционные аргументы в кортеж (tuple), а **kwargs собирает именованные аргументы в словарь (dictionary).
*args
На этом шаге вы сосредоточитесь конкретно на *args. Этот синтаксис позволяет функции принимать произвольное количество позиционных аргументов. Эти аргументы собираются в кортеж (tuple).
Очистите предыдущее содержимое из main.py и добавьте следующий код. Этот пример определяет функцию, которая принимает *args и выводит полученные аргументы вместе с их типом.
## *args collects positional arguments into a tuple
def some_function(*args):
print(f'Arguments passed: {args} as {type(args)}')
## Pass multiple arguments - they'll be collected into the args tuple
some_function('arg1', 'arg2', 'arg3')
В этом коде *args в сигнатуре функции указывает Python собрать все дополнительные позиционные аргументы, переданные в some_function, и поместить их в кортеж с именем args.
Теперь запустите скрипт из терминала:
python3 main.py
Вывод подтвердит, что аргументы были переданы в виде кортежа:
Arguments passed: ('arg1', 'arg2', 'arg3') as <class 'tuple'>
Это демонстрирует, как *args предоставляет простой способ обработки переменного числа входных данных без необходимости определять каждый из них как отдельный параметр.
**kwargs
На этом шаге вы узнаете, как использовать **kwargs. Этот синтаксис используется для сбора произвольного количества именованных аргументов (keyword arguments) в словарь (dictionary). Это полезно, когда вы хотите обрабатывать именованные аргументы, которые вы не определили заранее.
Очистите содержимое main.py и добавьте следующий код. Этот пример определяет функцию, которая принимает **kwargs и выводит собранные именованные аргументы и их тип.
## **kwargs collects keyword arguments into a dictionary
def some_function(**kwargs):
print(f'keywords: {kwargs} as {type(kwargs)}')
## Pass keyword arguments - they'll be collected into the kwargs dict
some_function(key1='arg1', key2='arg2')
Здесь **kwargs в сигнатуре функции указывает Python собрать все именованные аргументы, переданные в some_function, в словарь с именем kwargs. Ключами словаря являются имена аргументов, а значениями — значения аргументов.
Запустите скрипт из терминала:
python3 main.py
Вывод покажет, что именованные аргументы были собраны в словарь:
keywords: {'key1': 'arg1', 'key2': 'arg2'} as <class 'dict'>
Эта функция широко используется в Python для тех случаев, когда необходимо передать опции или конфигурации, что позволяет делать вызовы функций чистыми и читаемыми.
Резюме
В этой лабораторной работе вы узнали, как использовать *args и **kwargs в Python для создания более гибких функций.
Вы узнали, что:
*argsсобирает переменное число позиционных аргументов в кортеж (tuple).**kwargsсобирает переменное число именованных аргументов (keyword arguments) в словарь (dictionary).argsиkwargs— это общепринятые имена, но именно синтаксис*и**обеспечивает эту функциональность.
Освоение *args и **kwargs является ключевым шагом в написании более продвинутого и повторно используемого кода на Python. Теперь вы можете создавать функции, которые лучше адаптируются к различным типам входных данных.



