O que faz um asterisco simples nos argumentos de uma função?
Quando olhei para o módulo pickle , vi o seguinte:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Eu sei sobre um asterisco único e duplo precedendo argumentos (para número variável de argumentos), mas isso não precede nada. E tenho certeza que isso não tem nada a ver com picles. Provavelmente é apenas um exemplo disso. Eu só aprendi o nome dele quando enviei para o intérprete:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Se isso importa, estou no python 3.3.0.
Respostas:
Nua
*
é usada para forçar o chamador a usar argumentos nomeados - portanto, você não pode definir uma função*
como argumento quando não possui os seguintes argumentos de palavra-chave.Veja esta resposta ou a documentação do Python 3 para obter mais detalhes.
fonte
*args
, devem ocorrer antes do nada*
.*
está no lugar de*args
e vice-versa; eles não podem coexistir em uma assinatura. Por isso eles escolheram*
; anteriormente,*args
era a única maneira de forçar argumentos puramente posicionais, e marcava o final dos argumentos que poderiam ser passados posicionalmente (uma vez que reunia todos os argumentos posicionais restantes, eles podiam alcançar os seguintes argumentos nomeados).*
significa que os mesmos "argumentos posicionais não podem ir além daqui", mas a falta de um nome significa "mas eu não os aceitarei, porque escolhi não fornecer um local para colocá-los".Enquanto a resposta original responde a pergunta completamente, basta adicionar um pouco de informações relacionadas. O comportamento do asterisco único deriva de
PEP-3102
. Citando a seção relacionada:Em inglês simples, significa que, para passar o valor da chave, você precisará explicitamente passá-lo como
key="value"
.fonte
*
é devorar os argumentos posicionais restantes, mas esse não é o caso. Passar argumentos posicionais extras do que a função espera, gera um erro desse tipo:foo() takes exactly 1 positional argument (2 given)
o exemplo acima com ** kwargs
fonte
Semanticamente, significa que os argumentos a seguir são apenas de palavra-chave; portanto, você receberá um erro se tentar fornecer um argumento sem especificar seu nome. Por exemplo:
Pragmaticamente, isso significa que você deve chamar a função com um argumento de palavra-chave. Geralmente é feito quando seria difícil entender o objetivo do argumento sem a dica dada pelo nome do argumento.
Compare, por exemplo,
sorted(nums, reverse=True)
vs. se você escreveusorted(nums, True)
. O último seria muito menos legível, então os desenvolvedores do Python escolheram fazer com que você escrevesse da maneira anterior.fonte
Suponha que você tenha uma função:
Você pode chamar esta função de duas maneiras:
sum(1,2)
ousum(1,key=2)
Suponha que você queira que a função
sum
seja chamada apenas usando argumentos de palavra-chave.Você adiciona
*
à lista de parâmetros da função para marcar o final dos argumentos posicionais.Então, a função definida como:
pode ser chamado apenas usando
sum(1,key=2)
fonte
Eu encontrei o seguinte link para ser muito útil explicando
*
,*args
e**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Essencialmente, além das respostas acima, aprendi no site acima (crédito: https://pythontips.com/author/yasoob008/ ) o seguinte:
Com a função de demonstração definida primeiro abaixo, existem dois exemplos, um com
*args
e outro com**kwargs
Portanto,
*args
permite criar dinamicamente uma lista de argumentos que serão obtidos na ordem em que são alimentados, enquanto**kwargs
podem permitir a passagem de argumentos NAMED e podem ser processados por NAME de acordo (independentemente da ordem em que eles são alimentados) .O site continua, observando que a ordem correta dos argumentos deve ser:
fonte