As funções também podem ser chamadas usando argumentos de palavra-chave no formato ‘keyword = value’. Por exemplo, a seguinte função:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): print "-- This parrot wouldn't", action, print "if you put", voltage, "volts through it." print "-- Lovely plumage, the", type print "-- It's", state, "!"
poderia ser chamado de uma das seguintes maneiras:
parrot(1000) parrot(action = 'VOOOOOM', voltage = 1000000) parrot('a thousand', state = 'pushing up the daisies') parrot('a million', 'bereft of life', 'jump')
mas as seguintes chamadas seriam inválidas:
parrot() # required argument missing parrot(voltage=5.0, 'dead') # non-keyword argument # following keyword parrot(110, voltage=220) # duplicate value for # argument parrot(actor='John Cleese') # unknown keyword
Em geral, uma lista de argumentos deve ter qualquer argumento posicional seguido por qualquer argumento de palavra-chave, onde as palavras-chave devem ser escolhidas a partir dos nomes de parâmetros formais. Não é importante se um parâmetro formal tem um valor padrão ou não. Nenhum argumento pode receber um valor mais de uma vez – nomes de parâmetro formais correspondentes a argumentos posicionais não podem ser usados como palavras-chave nas mesmas chamadas. Aqui está um exemplo que falha devido a essa restrição:
>>> def function(a): ... pass ... >>> function(0, a=0) Traceback (most recent call last): File "", line 1, in ? TypeError: function() got multiple values for keyword argument 'a'
Quando um parâmetro formal final do formulário **name está presente, ele recebe um dicionário contendo todos os argumentos de palavra-chave, exceto aqueles correspondentes a um parâmetro formal. Isso pode ser combinado com um parâmetro formal do formulário *name (descrito na próxima subseção) que recebe uma tupla contendo os argumentos posicionais além da lista formal de parâmetros. (*name deve ocorrer antes de **name.) Por exemplo, se definirmos uma função como esta:
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 keys = keywords.keys() keys.sort() for kw in keys: print kw, ':', keywords[kw]
Poderia ser chamado assim:
cheeseshop('Limburger', "It's very runny, sir.", "It's really very, VERY runny, sir.", client='John Cleese', shopkeeper='Michael Palin', sketch='Cheese Shop Sketch')
e é claro que imprimiria:
-- 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. ---------------------------------------- client : John Cleese shopkeeper : Michael Palin sketch : Cheese Shop Sketch
Observe que o método sort() da lista de nomes de argumentos de palavras-chave é chamado antes de imprimir o conteúdo do dicionário de palavras-chave; se isso não for feito, a ordem em que os argumentos são impressos é indefinida.