Функции можно вызывать, используя ключевые аргументы, в виде 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
Обратите внимание, что порядок, в котором печатаются ключевые аргументы, гарантированно соответствует порядку, в котором они были предоставлены при вызове функции.