Сообщить об ошибке.

Ключевые аргументы функций

Функции можно вызывать, используя ключевые аргументы, в виде kwarg=value. Например, следующая функция:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

принимает один позиционный аргумент (voltage, их еще называют обязательными) и три дополнительных ключевых аргумента (state, actionи, type). Эта функция может быть вызвана любым из следующих способов:

parrot(1000)                                          # 1 позиционный аргумент
parrot(voltage=1000)                                  # 1 ключевой аргумент
parrot(voltage=1000000, action='VOOOOOM')             # 2 ключевых аргумента
parrot(action='VOOOOOM', voltage=1000000)             # 2 ключевых аргумента
parrot('a million', 'bereft of life', 'jump')         # 3 позиционных аргумента
parrot('a thousand', state='pushing up the daisies')  # 1 позиционный, 1 ключевой аргумент

но все следующие вызовы будут недействительными:

parrot()                     # отсутствует обязательный аргумент
parrot(voltage=5.0, 'dead')  # аргумент без ключевого слова, после ключевого аргумента
parrot(110, voltage=220)     # повторяющееся значение для одного и того же аргумента
parrot(actor='John Cleese')  # неизвестное ключевое слово
  • При вызове функции, ключевые аргументы должны следовать за позиционными аргументами.
  • Все передаваемые в функцию ключевые имена должны соответствовать одному из аргументов, указанных в определении функции (например actor, не является допустимым именем для аргумента функции parrot()).
  • Порядок ключевых аргументов не важен.
  • Ключевые слова, также можно указывать у обязательных аргументов функции, используя в качестве ключевого слова имя аргумента (например, parrot(voltage=1000), тоже допустимо).
  • Ни один из аргументов в функции не может получить значение более одного раза.
    Вот пример, который терпит неудачу из-за этого ограничения:

    >>> def function(a):
    ...     pass
    ...
    >>> function(0, a=0) # аргумент 'a' указан 2 раза, как позиционный и как ключевой 
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    TypeError: function() got multiple values for keyword argument 'a'
    >>>
    

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

Например, если мы определим функцию, подобную этой:

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

Эту функцию можно вызвать так:

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")

Функция cheeseshop напечатает:

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch

Обратите внимание, что порядок, в котором печатаются ключевые аргументы, гарантированно соответствует порядку, в котором они были предоставлены при вызове функции.