Uma das coisas mais interessantes do Python é como ele interage com as suas estruturas de dados padrão, sendo um dos exemplos mais interessantes o desempacotamento de listas e dicionários. A situação é simples, vamos supor que você tenha uma lista de parâmetros e deseja passar para uma função, podemos testar a seguinte situação:
def funcao(parametro1, parametro2, parametro3):
print(parametro1, parametro2, parametro3)
parametros = [1,2,3]
funcao(parametros)
Mas temos o seguinte erro:
TypeError: funcao() missing 2 required positional arguments: ‘parametro2’ and ‘parametro3’
Isso ocorre pois a lista é enviada para o parametro1, deixando os outros parâmetros vazios. Para resolvermos isso o Python nos fornece uma sintaxe que permite desempacotar os valores para enviar como parâmetro, utilzando * e ** (este último para dicionários).
Muitas vezes você irá ver por ai a seguinte sintaxe:
def funcao(parametro1, parametro2, parametro3):
print(parametro1, parametro2, parametro3)
parametros = ["Spam", "Spam", "Spam"]
funcao(*parametros)
Se você quiser enviar os parâmetros de maneira nomeada (para poder trocar a ordem deles), você pode utilizar um dicionário para desempacotar:
def funcao(parametro1, parametro2, parametro3):
print(parametro1, parametro2, parametro3)
parametros = {
'parametro1': '1',
'parametro2': '2',
'parametro3': '3',
}
funcao(**parametros)
Esta solução é muito útil para diversas situações, como deixar a chamada de uma função com muitos parâmetros mais limpa, construir os parâmetros no decorrer do código para só chamar ao final e até criar dinâmicamente os parâmetros:
# Função com muitos parâmetros
def funcao(parametro1, parametro2, parametro3, parametro4, parametro5, parametro6):
print(parametro1, parametro2, parametro3)
print(parametro4, parametro5, parametro6)
# Construindo parâmetros
parametros = {
'parametro1': 1,
'parametro2': 2,
'parametro3': 3,
'parametro4': 4,
'parametro5': 5,
'parametro6': 6,
}
# Chamando passando parâmetros desempacotados
funcao(**parametros)
# Criando parâmetros dinamicamente!
funcao(**{f"parametro{i}": i for i in range(1, 7)})