4.7.2 Keyword Arguments

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.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s