Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Conversor de tipos

Excelente tarde,

Segue o código feito para a solução da atividade

"""Conversão de telefones (string -> int) para o cadastro de clientes da loja."""

import re

# Dados de exemplo: telefones armazenados como string, em formatos variados
clientes = [
    {"nome": "Ana Souza", "telefone": "(67) 99999-8888"},
    {"nome": "Carlos Lima", "telefone": "67 3421-1234"},
    {"nome": "Marta Reis", "telefone": "abc"},
    {"nome": "João Pinto", "telefone": ""},
]

PALAVRA_SAIR = "sair"


def limpar_telefone(texto):
    """Remove tudo que não for dígito (parênteses, espaços, hífens etc.)."""
    return re.sub(r"\D", "", texto)


def telefone_valido(digitos):
    """Aceita DDD + 8 dígitos (fixo) ou DDD + 9 dígitos (celular)."""
    return len(digitos) in (10, 11)


def converter_telefone(texto):
    """Converte o texto em inteiro. Levanta ValueError se for inválido."""
    digitos = limpar_telefone(texto)
    if not telefone_valido(digitos):
        raise ValueError(f"Telefone inválido: {texto!r}")
    return int(digitos)


def formatar_telefone(numero):
    """Formata o telefone (int) para exibição, ex.: (67) 99999-8888.

    Retorna 'sem telefone' se o valor for None (cliente pulado).
    """
    if numero is None:
        return "sem telefone"
    digitos = str(numero)
    ddd, resto = digitos[:2], digitos[2:]
    return f"({ddd}) {resto[:-4]}-{resto[-4:]}"


def solicitar_telefone(nome):
    """Pede o telefone até ser válido. Retorna None se digitar 'sair'."""
    while True:
        entrada = input(
            f"Digite o telefone de {nome} (com DDD) ou '{PALAVRA_SAIR}' para pular: "
        )
        if entrada.strip().lower() == PALAVRA_SAIR:
            return None
        try:
            return converter_telefone(entrada)
        except ValueError:
            print("  Valor inválido. Use DDD + número (10 ou 11 dígitos).")


def converter_cliente(cliente):
    """Devolve uma cópia do cliente com o telefone convertido para int.

    Se o usuário pular, o cliente é mantido com telefone None.
    """
    try:
        telefone = converter_telefone(cliente["telefone"])
    except ValueError:
        print(f"\nTelefone de {cliente['nome']} inválido: {cliente['telefone']!r}")
        telefone = solicitar_telefone(cliente["nome"])
    return {**cliente, "telefone": telefone}


def converter_cadastro(lista_clientes):
    """Converte o telefone de todos os clientes da lista."""
    return [converter_cliente(c) for c in lista_clientes]


def main():
    cadastro = converter_cadastro(clientes)
    print("\nCadastro convertido:")
    for c in cadastro:
        print(f"  {c['nome']}: {formatar_telefone(c['telefone'])}")

    pendentes = [c["nome"] for c in cadastro if c["telefone"] is None]
    if pendentes:
        print(f"\nClientes sem telefone (pulados): {', '.join(pendentes)}")


if __name__ == "__main__":
    main()
    ```
1 resposta

Oi, Laura. Tudo bem com você?

Você mandou super bem na construção da solução para o conversor de tipos no cadastro de clientes. O modo como você modulou as funções, separando a responsabilidade do tratamento com expressões regulares através do módulo re, a validação do tamanho das entradas e a conversão segura utilizando o tratamento de exceções com try/except ficou excelente.

Construir rotinas que tratam dados inconsistentes é um desafio constante no dia a dia do desenvolvimento de software. A sua abordagem para lidar com números incorretos garantindo o retorno via terminal com a função solicitar_telefone deixa a experiência de uso bem fluida e tolerante a falhas do usuário.

Parabéns pelo excelente código enviado e por ter compartilhado sua solução aqui no fórum. Continue praticando e lembre-se de que o fórum está sempre à disposição para o que precisar.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!