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:

1
2
3
4
5
6
7
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:

1
2
3
4
5
6
7
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 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)})