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 modo for "soma", retornar a soma de todos os *args (números).
  • Se modo for "lista", retornar uma lista com todos os *args.
  • Em ambos os casos, incluir os **kwargs em 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 dos args; se modo == "lista", retornar uma lista com os args.
  • Imprimir os kwargs formatados como "Extras: {kwargs}".
  • Para modo inválido, levantar ValueError.

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

  1. Definimos processar com *args (posicionais variáveis), modo (keyword-only obrigatório, após *), e **kwargs (nomeados variáveis).
  2. Primeiro, imprimimos os kwargs no formato pedido: f"Extras: {kwargs}".
  3. Verificamos o valor de modo. Se for "soma", retornamos sum(args).
  4. Se for "lista", retornamos list(args) (convertendo a tupla em lista).
  5. Se for outro valor, levantamos ValueError com mensagem clara.
  6. Nas chamadas, passamos os argumentos posicionais, depois modo como nomeado e os extras como nomeados.
  7. 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 modo posicionalmente: processar(1, 2, 3, "soma") gera TypeError porque modo é keyword-only.
  • Esquecer modo: processar(1, 2, 3) gera TypeError por falta de argumento obrigatório.
  • Confundir args com lista: args é uma tupla; para obter lista, use list(args).
  • Modificar kwargs diretamente: 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