Объясните аргументы только для ключевого слова (VarArgs) в Python

См. код ниже: -

#!/usr/bin/python
# Filename: total.py

def total(initial=5, *numbers, **keywords):
    count = initial
    for number in numbers:
        count += number
    for key in keywords:
        count += keywords[key]
    return count

print(total(10, 1, 2, 3, vegetables=50, fruits=100))

Может кто-нибудь объяснить, как * цифры и ** ключевые слова собирают аргументы? Простое объяснение очень важно Спасибо заранее

Ответы

Ответ 1

В вашем коде numbers назначен (1,2,3) кортеж. keywords присваивается словарь, содержащий vegetables и fruits.

Одна звезда (*) определяет позиционные аргументы. Это означает, что вы можете получить любое количество аргументов. Вы можете рассматривать переданные аргументы как кортеж.

Две звезды (**) определяют аргументы ключевых слов.

Справочный материал доступен здесь.

Примеры

Python 2.x(до аргументов только для ключевого слова)

def foo(x, y, foo=None, *args): print [x, y, foo, args]

foo(1, 2, 3, 4)            --> [1, 2, 3, (4, )]  # foo == 4
foo(1, 2, 3, 4, foo=True)  --> TypeError

Python 3.x(с аргументами только для ключевого слова)

def foo(x, y, *args, foo=None): print([x, y, foo, args])

foo(1, 2, 3, 4)           --> [1, 2, None, (3, 4)]  # foo is None
foo(1, 2, 3, 4, foo=True) --> [1, 2, True, (3, 4)]

def combo(x=None, *args, y=None): ...  # 2.x and 3.x styles in one function

Хотя опытный программист понимает, что произошло в 2.x, он противоречит интуиции (позиционный аргумент привязан к foo= независимо от аргументов ключевого слова, если есть достаточные позиционные аргументы)

Python 3.x вводит более интуитивные аргументы только для ключевого слова с PEP-3102 (аргументы ключевого слова после varargs могут быть связаны только по имени)