Объясните аргументы только для ключевых слов (VarArgs) в Python - PullRequest
17 голосов
/ 23 ноября 2010

Пожалуйста, смотрите код ниже: -

#!/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 Ответ

24 голосов
/ 23 ноября 2010

В вашем коде 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 могут быть связаны только по имени)

...