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.