Как использовать *args и **kwargs в функциях Python

Освойте *args и **kwargs в Python. Узнайте, как писать гибкие функции с динамическими позиционными и ключевыми аргументами, распаковывать коллекции и создавать функции-оболочки.

Попробуйте это решение в редакторе

Обзор

В Python вам часто придется разрабатывать функции, которые могут принимать переменное количество аргументов. Например, функция, вычисляющая сумму любого количества целых чисел, или функция, регистрирующая метаданные с различными полями. Вместо того, чтобы заставлять пользователей передавать список или словарь, Python предоставляет два специальных символа: `*args` и `**kwargs`.

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

С другой стороны, синтаксис `**kwargs` позволяет функции принимать любое количество аргументов с ключевыми словами (именованными). Двойная звездочка `**` собирает эти аргументы в словарь с именем `kwargs`. Это невероятно полезно для передачи дополнительных конфигураций, аргументов стиля или атрибутов базы данных. Помните, что имена «args» и «kwargs» являются условными; фактическая функциональность определяется одинарной и двойной звездочками.

Код и вывод выполнения

Этот код демонстрирует использование *args для суммирования чисел переменных, **kwargs для печати профилей пользователей и объединение обоих в одной функции.

def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
Терминальный выход
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

Пошаговая реализация

  • Используйте одну звездочку перед параметром (например, *args), чтобы собрать позиционные аргументы в кортеж.
  • Используйте двойную звездочку перед параметром (например, **kwargs), чтобы собрать аргументы ключевого слова в словарь.
  • Соблюдайте правильный порядок параметров: стандартные параметры, *args, параметры только с ключевыми словами, затем **kwargs.
  • Используйте синтаксис распаковки при вызове функций, передавая *iterable или **dictionary.

Часто задаваемые вопросы

Должен ли я использовать имена «args» и «kwargs»?

Нет, это стандартные соглашения сообщества. Синтаксически необходимы только префиксы * и **. Вы можете написать *values ​​и **options, но для удобства чтения настоятельно рекомендуется придерживаться *args и **kwargs.

Каков правильный порядок определения функции?

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

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.