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, *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 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 *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:
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.