1
resposta

[Dúvida] Validando um CPF

Gostaria de formas mais "Pythonicas" para simplificar/otimizar esse trecho de código.
main.py

from validador import validador_cpf
numero_cpf = input('Digite o seu CPF: ')
validador_cpf(numero_cpf)

validador.py

def validador_cpf(numero_cpf):
        cpf = numero_cpf
        if cpf.isdigit() and len(cpf) == 11:
            print(f'O CPF {cpf} é valido.')
        else:
            print(f'O valor {cpf} é inválido.')
1 resposta

Oi William, tudo bem?

É muito interessante ver sua preocupação em escrever um código mais "Pythônico". Isso demonstra que você está buscando não apenas fazer o programa funcionar, mas também utilizar o que a linguagem oferece de melhor para tornar o código mais limpo e legível.

Vou mandar algumas sugestões de como você pode otimizar e organizar melhor seu código.

Simplificando a lógica:

No Python, podemos combinar as verificações de uma forma muito direta e expressiva. No seu código atual, você usa o if/else pra dar uma resposta genérica, mas o desafio propõe mensagens de erro específicas para cada caso.

Uma forma Pythônica de lidar com isso é manter a função focada em retornar uma resposta, deixando para o programa principal a tarefa de imprimir o resultado.

Sugestões de melhoria:

  • Uso de cláusulas de guarda: Em vez de aninhar condições, podemos verificar os erros primeiro e sair da função o quanto antes. Isso evita o uso excessivo de else e deixa o fluxo mais linear.
  • Validação em uma linha: Se o objetivo for apenas um "Sim" ou "Não" (booleano), poderíamos usar apenas return cpf.isdigit() and len(cpf) == 11. Mas, para mensagens detalhadas, as condicionais separadas são melhores para o usuário.
  • Tratamento de strings: É comum que usuários digitem o CPF com pontos ou traços. Você pode usar .replace(".", "").replace("-", "") antes da validação para tornar seu código mais flexível.

Exemplo de código refatorado

def validador_cpf(cpf):
    # verifica se há caracteres não numéricos primeiro
    if not cpf.isdigit():
        return "Erro: O CPF deve conter apenas números."
    
    # verifica o tamanho exato
    if len(cpf) != 11:
        return "Erro: O CPF deve ter exatamente 11 dígitos."
    
    return "CPF válido."

E no seu main.py:

from validador import validador_cpf

numero_cpf = input('Digite o seu CPF: ')
resultado = validador_cpf(numero_cpf)
print(resultado)

por que isso é mais Pythônico?

  1. Responsabilidade única: Sua função agora processa a informação e devolve um texto, sem se preocupar em "printar" diretamente. Isso facilita se, no futuro, você quiser usar essa mesma função em um site ou aplicativo mobile.
  2. Legibilidade: O código lê-se quase como uma frase em inglês, o que é um dos pilares da filosofia do Python.
  3. Manutenção: Se a regra do CPF mudar para 12 dígitos, você altera apenas um lugar de forma clara.

Você fez um ótimo trabalho ao separar a lógica em arquivos diferentes, essa já é uma excelente prática de organização.

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