Qual a diferença entre "argumentos de palavras-chave" e argumentos regulares? Todos os argumentos não podem ser passados como em name=value
vez de usar a sintaxe posicional?
289
Qual a diferença entre "argumentos de palavras-chave" e argumentos regulares? Todos os argumentos não podem ser passados como em name=value
vez de usar a sintaxe posicional?
Respostas:
Existem dois conceitos relacionados, ambos chamados " argumentos de palavras-chave ".
No lado de chamada, que é o que outros comentadores mencionaram, você pode especificar alguns argumentos de função por nome. Você deve mencioná-los depois de todos os argumentos sem nomes ( argumentos posicionais ) e deve haver valores padrão para quaisquer parâmetros que não foram mencionados.
O outro conceito está no lado da definição de função: você pode definir uma função que aceita parâmetros por nome - e nem precisa especificar quais são esses nomes. Estes são argumentos puros de palavras-chave e não podem ser passados posicionalmente. A sintaxe é
Qualquer argumento de palavra-chave que você passar para esta função será colocado em um dicionário chamado
kwargs
. Você pode examinar as chaves deste dicionário em tempo de execução, assim:fonte
kwargs
ou posso renomeá-lo para sth. likeoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
é a convenção quando não há um nome mais apropriadoHá um último recurso de idioma em que a distinção é importante. Considere a seguinte função:
O
*positional
argumento armazenará todos os argumentos posicionais passados parafoo()
, sem limite para quantos você pode fornecer.O
**keywords
argumento armazenará qualquer argumento de palavra-chave:E é claro, você pode usar os dois ao mesmo tempo:
Esses recursos raramente são usados, mas ocasionalmente são muito úteis e é importante saber quais argumentos são posicionais ou palavras-chave.
fonte
*positional
e**keywords
se mudarmos a definição de função comodef foo(arg1, *positional, **keywords):
. Aquiarg1
é posicional e obrigatório. Observe que a resposta posicional significa número opcional e variável de argumentos posicionais.foo(bar=True)
poderá obter os valores usando obar = keywords.pop('bar')
mesmo quebar = keywords.pop('bar', None)
. Para o valor padrão, usebar = keywords.pop('bar', False)
Usar argumentos de palavra-chave é a mesma coisa que argumentos normais, exceto que a ordem não importa. Por exemplo, as duas chamadas de funções abaixo são as mesmas:
fonte
Argumentos posicionais
Eles não têm palavras-chave antes deles. A ordem é importante!
Argumentos de palavras-chave
Eles têm palavras-chave na frente. Eles podem estar em qualquer ordem!
Você também deve saber que, se você usar argumentos padrão e negligenciar a inserção das palavras-chave, o pedido será importante!
fonte
func("bar", 5)
? E então diga quehello
obtém seu valor padrão de3
.Existem duas maneiras de atribuir valores de argumento aos parâmetros de função, ambos são usados.
Por posição. Argumentos posicionais não possuem palavras-chave e são atribuídos primeiro.
Por palavra-chave. Os argumentos de palavra-chave possuem palavras-chave e são atribuídos em segundo lugar, após argumentos posicionais.
Observe que você tem a opção de usar argumentos posicionais.
Se você não usar argumentos posicionais, tudo o que você escreveu será um argumento de palavra-chave.
Quando você chamar uma função de tomar uma decisão para a posição de utilização ou palavra-chave ou uma mistura. Você pode optar por fazer todas as palavras-chave, se quiser. Alguns de nós não fazem essa escolha e usam argumentos posicionais.
fonte
Estou surpreso que ninguém parece ter apontado que alguém pode passar um dicionário de parâmetros de argumento com chave, que satisfazem os parâmetros formais, assim.
fonte
, **kwargs
. Isso demonstraria que mesmo um simples func def, com um número fixo de parâmetros, pode receber um dicionário. Ou seja, não requer nada sofisticado na definição. ENTÃO, você pode adicionar um segundo exemplo, WITH ** kwargs na definição, e mostrar como os itens EXTRA no dicionário estão disponíveis por meio disso.print 'a:%s, b:%s, c:%s' % (a, b, c)
dá erro de sintaxe, no entantoprint('a:%s, b:%s, c:%s' % (a, b, c))
funciona. Algo com a versão Python? De qualquer forma, obrigado por essa visão, até agora eu estava usando o mais desajeitadoprint('a:{}, b:{}, c:{}'.format(a, b, c))
Usando Python 3 você pode ter ambos palavra-chave necessários e não necessários argumentos :
Opcional : (valor padrão definido para o parâmetro 'b')
Necessário (nenhum valor padrão definido para o parâmetro 'b'):
Isso pode ajudar nos casos em que você tem muitos argumentos semelhantes, especialmente se forem do mesmo tipo; nesse caso, prefiro usar argumentos nomeados ou crio uma classe personalizada se os argumentos pertencerem.
fonte
Estou surpreso que ninguém tenha mencionado o fato de que você pode misturar argumentos posicionais e de palavras-chave para fazer coisas sorrateiras como essa usando
*args
e**kwargs
( deste site ):Isso permite que você use argumentos arbitrários de palavras-chave que podem ter chaves que você não deseja definir antecipadamente.
fonte
Eu estava procurando por um exemplo que tivesse kwargs padrão usando a anotação de tipo:
exemplo:
fonte
Basta suplementar / adicionar uma maneira de definir o valor padrão dos argumentos que não são atribuídos em palavras-chave ao chamar a função:
chame isso por:
você terá:
leia mais sobre
*args
e**kwargs
em python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3fonte