Desafio Python
Função com *args, **kwargs e keyword-only
Enunciado
Crie uma função processar que aceite qualquer número de argumentos posicionais (*args), um parâmetro keyword-only obrigatório modo (que deve ser "soma" ou "lista"), e qualquer número de argumentos nomeados extras (**kwargs). A função deve:
- Se
modofor"soma", retornar a soma de todos os*args(números). - Se
modofor"lista", retornar uma lista com todos os*args. - Em ambos os casos, incluir os
**kwargsem um dicionário separado e imprimir uma mensagem com eles.
Teste chamando a função com diferentes combinações e imprima os resultados.
Requisitos
- A função deve ter a assinatura
def processar(*args, modo, **kwargs):. modoé keyword-only e obrigatório.- Se
modo == "soma", retornar a soma dosargs; semodo == "lista", retornar uma lista com osargs. - Imprimir os
kwargsformatados como"Extras: {kwargs}". - Para
modoinválido, levantarValueError.
Código inicial
def processar(*args, modo, **kwargs):
# Complete a função
pass
# Teste as chamadas
Saída esperada
Extras: {'nome': 'Ana'}
Soma: 6
Extras: {'idade': 25}
Lista: [1, 2, 3]
Extras: {}
Soma: 10
Ver dica
Use if modo == "soma": e elif modo == "lista":. Para somar, use sum(args). Para criar lista, use list(args). Não esqueça de imprimir os kwargs antes de retornar.
Mostrar solução
def processar(*args, modo, **kwargs):
"""Processa args de acordo com o modo e imprime kwargs."""
print(f"Extras: {kwargs}")
if modo == "soma":
return sum(args)
elif modo == "lista":
return list(args)
else:
raise ValueError(f"Modo inválido: {modo}")
# Teste 1: soma com kwargs
resultado1 = processar(1, 2, 3, modo="soma", nome="Ana")
print(f"Soma: {resultado1}")
# Teste 2: lista com kwargs
resultado2 = processar(1, 2, 3, modo="lista", idade=25)
print(f"Lista: {resultado2}")
# Teste 3: soma sem kwargs
resultado3 = processar(4, 6, modo="soma")
print(f"Soma: {resultado3}")
Passo a passo
- Definimos
processarcom*args(posicionais variáveis),modo(keyword-only obrigatório, após*), e**kwargs(nomeados variáveis). - Primeiro, imprimimos os
kwargsno formato pedido:f"Extras: {kwargs}". - Verificamos o valor de
modo. Se for"soma", retornamossum(args). - Se for
"lista", retornamoslist(args)(convertendo a tupla em lista). - Se for outro valor, levantamos
ValueErrorcom mensagem clara. - Nas chamadas, passamos os argumentos posicionais, depois
modocomo nomeado e os extras como nomeados. - Imprimimos os resultados formatados.
Por que funciona
*args captura todos os argumentos posicionais em uma tupla, permitindo número variável. modo é keyword-only porque está após *, então só pode ser passado por nome, evitando confusão. **kwargs captura os nomeados extras em um dicionário. A combinação oferece grande flexibilidade e clareza.
Erros comuns
- Passar
modoposicionalmente:processar(1, 2, 3, "soma")geraTypeErrorporquemodoé keyword-only. - Esquecer
modo:processar(1, 2, 3)geraTypeErrorpor falta de argumento obrigatório. - Confundir
argscom lista:argsé uma tupla; para obter lista, uselist(args). - Modificar
kwargsdiretamente: não é erro, mas evite; trate como somente leitura.
Outra forma de resolver
Poderia usar if modo not in ("soma", "lista"): raise ValueError antes de processar, mas a estrutura if/elif/else é igualmente clara.
Saída esperada
Extras: {'nome': 'Ana'}
Soma: 6
Extras: {'idade': 25}
Lista: [1, 2, 3]
Extras: {}
Soma: 10