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:
- "o argumento da palavra-chave descompactando sintaxe"
Se você possui uma lista de argumentos, *argsela é 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 em a, *middle, end = my_tuple, diria "desembalar a 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 *argsargumento é 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:
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]: Iterables são objetos que implementam o __iter__()método e mapeamentos são objetos que implementam keys()e __getitem__(). Qualquer objeto que suporte esse protocolo será entendido pelos construtores tuple()e dict(), portanto, eles podem ser usados para descompactar argumentos.