Ao programar o Python, às vezes faço um **
para fazer uma conversão. Entendo o que ele faz, mas quais estruturas de dados estou manipulando? A dict
e qual é a outra? Um array
? Existe um nome para o **
operador?
python
operators
type-conversion
Niklas Rosencrantz
fonte
fonte
**
. Poder e "dicionário de argumentos de palavras-chave". Do que você está falando? A documentação possui as seguintes palavras: "Se o formulário" ** identificador "estiver presente, ele será inicializado para um novo dicionário que receba argumentos de palavras-chave em excesso, assumindo como padrão um novo dicionário vazio". Quais deles parecem relevantes para sua pergunta?Respostas:
Não é um operador como tal, para que ele não realmente tem um nome, mas ela é definida como uma "regra sintática" . Por isso, deve ser chamado:
Se você possui uma lista de argumentos,
*args
ela é chamada de "descompactação de argumento" , da mesma maneira que**kwargs
é chamada de "descompactação de argumento de palavra-chave" .Se você usá-lo no lado esquerdo de um
=
, como ema, *middle, end = my_tuple
, diria "desembalar a tupla" .No total, existem três tipos de argumentos (parâmetro único):
O
*args
argumento é chamado de "parâmetro posicional 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 variável aceita todos os argumentos que você passa.A maior parte disso pode ser encontrada nas PEPs 0362 e 3102 , bem como na seção Fluxo de Controle dos documentos. Note-se, porém, que o objeto PEP da assinatura da 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. :)
Portanto, os argumentos
*
e**
apenas descompactam suas respectivas estruturas de dados:[1]: Iterables são objetos que implementam o
__iter__()
método e mapeamentos são objetos que implementamkeys()
e__getitem__()
. Qualquer objeto que suporte esse protocolo será entendido pelos construtorestuple()
edict()
, portanto, eles podem ser usados para descompactar argumentos.fonte
def f(x, *xs, y=0): pass
sintaxe do Python 2. {5,6,7} não é válida, nem faz odef f(x, y=0, *xs):
que você poderia esperar. AFAIK, a única maneira de alcançar o (obviamente) efeito pretendido édef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. O Python 3 lida com a sintaxe original conforme o esperado.begin, *middle, end = (0, 1, 2, 3, 4, 5)
sintaxe também não funciona no Python 2.x.Eu não acho que tenha um nome. Nos documentos do Python, em "Descompactar listas de argumentos", é conhecido como "o
**
operador".Não sei ao certo o que você quer dizer com "a outra" estrutura de dados. Quando você
f(**kwargs)
descompacta o dicionáriokwargs
como uma sequência de pares de valores-chave. Não vejo que exista outra estrutura envolvida.Copiarei o exemplo na documentação acima para maior clareza.
Veja também: O que significam * args e ** kwargs?
fonte
f(**kwargs)
...Se você não souber ao certo como chamar um operador específico ou se ele não tiver nome, sempre poderá recorrer ao Waka Waka Bang Splat como uma referência para ajudá-lo a descobrir como chamá-lo. Nesse caso,
**
eu chamaria issodouble-splat
, embora haja alguns nomes alternativos para símbolos .fonte