Quais são os usos para **kwargs
Python?
Eu sei que você pode fazer uma objects.filter
sobre uma mesa e passar uma **kwargs
discussão.
Também posso fazer isso para especificar deltas de tempo, ou seja timedelta(hours = time1)
?
Como exatamente isso funciona? É classes como 'descompactar'? Gosta a,b=1,2
?
kwargs
significaKeyWord ARGumentS
, ou seja, os argumentos que estabeleceram chavesRespostas:
Você pode usar
**kwargs
para permitir que suas funções recebam um número arbitrário de argumentos de palavras-chave ("kwargs" significa "argumentos de palavras-chave"):Você também pode usar a
**kwargs
sintaxe ao chamar funções, construindo um dicionário de argumentos de palavras-chave e passando-o para sua função:O Tutorial do Python contém uma boa explicação de como funciona, além de alguns bons exemplos.
<--Atualização-->
Para pessoas que usam Python 3, em vez de iteritems (), use items ()
fonte
Descompactando dicionários
**
descompacta dicionários.este
é o mesmo que
É útil se você precisar construir parâmetros:
Parâmetros de embalagem de uma função
Isso permite que você use a função assim:
fonte
** do unpack dictionaries.
>> mente soprada / é claro! +1 por explicar esse bit..iteritems()
foi renomeado para.items()
no Python 3.O kwargs é apenas um dicionário que é adicionado aos parâmetros.
Um dicionário pode conter pares de chave e valor. E esses são os kwargs. Ok, é assim.
O para quê não é tão simples.
Por exemplo (muito hipotético), você tem uma interface que apenas chama outras rotinas para fazer o trabalho:
Agora você obtém um novo método "drive":
Mas espere um minuto, há um novo parâmetro "veículo" - você não sabia disso antes. Agora você deve adicioná-lo à assinatura da função myDo.
Aqui você pode jogar kwargs em jogo - basta adicionar kwargs à assinatura:
Dessa forma, você não precisa alterar a assinatura da função da interface toda vez que algumas de suas rotinas chamadas podem mudar.
Este é apenas um bom exemplo que você pode considerar útil.
fonte
Com base em que uma boa amostra às vezes é melhor que um longo discurso, escreverei duas funções usando todas as facilidades de passagem de argumentos das variáveis python (argumentos posicionais e nomeados). Você deve poder ver facilmente o que faz sozinho:
E aqui está a saída:
fonte
Motivo:
*args
e**kwargs
serve como um espaço reservado para os argumentos que precisam ser passados para uma chamada de funçãousando
*args
e**kwargs
para chamar uma funçãoAgora usaremos
*args
para chamar a função definida acimaresultado:
arg1: dois
arg2: 3
arg3: 5
Agora, usando
**kwargs
para chamar a mesma funçãoresultado:
arg1: 5
arg2: dois
arg3: 3
Bottomline:
*args
não tem inteligência, ele simplesmente interpola os argumentos passados para os parâmetros (na ordem da esquerda para a direita) enquanto**kwargs
se comporta de maneira inteligente, colocando o valor apropriado no local necessáriofonte
kwargs
in**kwargs
é apenas o nome da variável. Você pode muito bem ter**anyVariableName
kwargs
significa "argumentos da palavra-chave". Mas eu acho que eles deveriam ser chamados de "argumentos nomeados", pois esses são simplesmente argumentos passados junto com nomes (não encontro significado para a palavra "palavra-chave" no termo "argumentos da palavra-chave". Acho que "palavra-chave" geralmente significa palavras reservadas pela linguagem de programação e, portanto, não devem ser usadas pelo programador para nomes de variáveis. Isso não está acontecendo aqui no caso de kwargs.). Por isso, damos nomesparam1
eparam2
para dois valores de parâmetros passados para a função da seguinte forma:func(param1="val1",param2="val2")
, em vez de passar apenas valores:func(val1,val2)
. Portanto, acho que eles devem ser chamados apropriadamente "número arbitrário de argumentos nomeados", pois podemos especificar qualquer número desses parâmetros (ou seja,func
func(**kwargs)
Sendo assim, deixe-me explicar primeiro "argumentos nomeados" e depois "número arbitrário de argumentos nomeados"
kwargs
.Argumentos nomeados
Exemplo
Número arbitrário de argumentos nomeados
kwargs
Exemplo
Passando variáveis tuplas e dict para argumentos personalizados
Para finalizar, deixe-me notar também que podemos passar
Assim, a mesma chamada acima pode ser feita da seguinte maneira:
Finalmente, observe
*
e**
nas chamadas de função acima. Se os omitirmos, podemos obter resultados ruins.Omitindo
*
em tuplas args:impressões
A tupla acima
('custom param1', 'custom param2', 'custom param3')
é impressa como está.Omitindo
dict
args:dá
fonte
keyword
terminologia vem do fato de você estar passando um ditado que é um banco de dados de pares de valores-chave.Além disso, você também pode misturar diferentes formas de uso ao chamar funções do kwargs:
dá esta saída:
Observe que ** kwargs deve ser o último argumento
fonte
kwargs é um açúcar sintático para passar argumentos de nome como dicionários (para func) ou dicionários como argumentos nomeados (para func)
fonte
Aqui está uma função simples que serve para explicar o uso:
Quaisquer argumentos que não sejam especificados na definição da função serão colocados na
args
lista, ou nakwargs
lista, dependendo se são argumentos de palavra-chave ou não:Se você adicionar um argumento de palavra-chave que nunca é passado para uma função, será gerado um erro:
fonte
Aqui está um exemplo que eu espero que seja útil:
Quando você executa o programa, obtém:
A chave aqui é que o número variável de argumentos nomeados na chamada se traduz em um dicionário na função.
fonte
Este é o exemplo simples de entender sobre a descompactação do python ,
eg1:
fonte
Em Java, você usa construtores para sobrecarregar classes e permitir vários parâmetros de entrada. No python, você pode usar o kwargs para fornecer um comportamento semelhante.
exemplo de java: https://beginnersbook.com/2013/05/constructor-overloading/
exemplo python:
apenas outra maneira de pensar sobre isso.
fonte
Os argumentos de palavra- chave costumam ser reduzidos para kwargs em Python. Na programação de computadores ,
O uso dos dois asterisco antes do nome do parâmetro, ** kwargs , é quando não se sabe quantos argumentos de palavras-chave serão passados para a função. Nesse caso, chama-se Argumentos de palavra-chave arbitrária / curinga.
Um exemplo disso são as funções de receptor do Django .
Observe que ele não precisa ser chamado de kwargs , mas precisa ter ** (o nome kwargs é uma convenção).
fonte