Qual é o nome de ** em python?

57

Ao programar o Python, às vezes, faço um ** para fazer uma conversão. Eu entendo o que isso faz, mas que estruturas de dados estou manipulando? Um dict e qual é o outro? Um array ? Existe um nome para o operador ** ?

    
por Niklas Rosencrantz 23.01.2012 / 18:41
fonte

3 respostas

80

Não é um operador como tal, por isso não tem realmente nome, mas é definido como uma" regra sintática ". Por isso deve ser chamado:

  • "o argumento da palavra-chave descompactando a sintaxe"

Se você tem uma lista de argumentos, *args , é chamado de "argumento desembalar" , da mesma maneira **kwargs é chamado "argumento de palavra-chave descompactando" .

Se você usá-lo no lado esquerdo de um = , como em a, *middle, end = my_tuple , diria "remoção de tupla" .

No total, existem três tipos de argumentos (parâmetro único):

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

O argumento *args é chamado de "parâmetro posicional de variável" e **kwargs é o "parâmetro de palavra-chave variável". Os argumentos somente de palavra-chave não podem ser fornecidos posicionalmente, porque um parâmetro posicional de variável levará todos os argumentos que você passar.

A maior parte disto pode ser encontrada em PEPs 0362 e 3102 , bem como no Fluxo de Controle da documentação. Deve-se notar, entretanto, que o PEP do objeto de assinatura de função é apenas um rascunho, e a terminologia pode ser apenas uma ideia de uma pessoa. Mas eles são bons termos de qualquer maneira. :)

Assim, os argumentos * e ** descompactam suas respectivas estruturas de dados:

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args) → f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: os iteráveis são objetos que implementam o método __iter__() e os mapeamentos são objetos que implementam keys() e __getitem__() . Qualquer objeto que suporte esse protocolo será entendido pelos construtores tuple() e dict() , para que eles possam ser usados para descompactar argumentos.

    
por 23.01.2012 / 19:46
fonte
13

Eu não acho que tenha um nome. No Documentos em Python em "Descompactando listas de argumentos", ele é conhecido como "o ** -operator ".

Não tenho certeza do que você quer dizer com "a outra" estrutura de dados. Quando você faz f(**kwargs) , descompacta o dicionário kwargs como uma sequência de pares de valores-chave. Não vejo que haja outra estrutura envolvida.

Vou copiar o exemplo na documentação acima para maior clareza.

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Veja também: O que significa * args e ** kwargs?

    
por 23.01.2012 / 19:04
fonte
3

Se você não tem certeza sobre o que chamar de um determinado operador ou se ele não tem nome, você sempre pode recorrer a Waka Waka Bang Splat como uma referência para ajudá-lo a descobrir como chamá-lo. Nesse caso, para ** eu chamaria de double-splat , embora existam alguns nomes alternativos para símbolos .

    
por 27.01.2012 / 03:11
fonte