Pergunta

Estou confuso com a declaração " imprimir(kw,":",palavras-chave[kw])" no programa a seguir, em python.

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)
    print(keywords)
    keys=sorted(keywords)
    print(keys)
    for kw in keys:
        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")

O resultado está abaixo:

--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', 'sketch': 'Cheese Shop Sketch', 'shopkeeper': 'Michael Palin'}
['client', 'shopkeeper', 'sketch']
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

Na minha ideia, "kw" deveria ser 'cliente', 'esboço' e 'lojista', não números, então como "kw" pode ser o índice de palavras-chave na instrução " imprimir(kw,":",palavras-chave[kw])"?

Para verificar minha ideia, também tentei outro programa:

letters=['a','b']
for kw in letters:
   print(letters[kw])

E uma resposta razoável aparece:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: list indices must be integers, not str

Além disso, isso me confunde com o problema que tive na primeira parte do programa. Acho que deveria aparecer o mesmo erro para mim.

Foi útil?

Solução

Argumentos de função precedidos por ** são chamados de "argumentos de palavra-chave", que recebem parâmetros nomeados ao chamar a função, por exemplo: client="John Cleese" no seu exemplo.Neste caso, “cliente” é o nome e “John Cleese” é o valor.Argumentos passados ​​dessa forma são colocados em uma dict, que é um armazenamento de valores-chave em vez de uma lista, com a qual você deve estar familiarizado no formato

x = {
      "foo": "bar"
    } 
print x["foo"] # prints "bar"

Outras dicas

Ele usa os utilitários de palavras-chave, é uma espécie de array com um nome de chave.

Você pode ver a descrição da lib, na documentação do python AQUI

Na verdade, existem propriedades especiais de argumentos **keywords que fornecem o direito de fazer isso.

AQUI é um tutorial para usá-lo (e também para entendê-lo) e AQUI é a questão relacionada ao stackoverflow.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top