Função para Validar CPF em Python
Função Python para validar CPF usando o algoritmo de módulo 11. Pode ser usada em aplicações Django, Flask, scripts de processamento de dados ou qualquer projeto Python.
Código
import re
def validar_cpf(cpf: str) -> bool:
# Remove caracteres não numéricos
cpf = re.sub(r'\D', '', cpf)
# Verifica se tem 11 dígitos
if len(cpf) != 11:
return False
# Rejeita CPFs com todos os dígitos iguais
if cpf == cpf[0] * 11:
return False
# Calcula o primeiro dígito verificador
soma = sum(int(cpf[i]) * (10 - i) for i in range(9))
resto = soma % 11
digito1 = 0 if resto < 2 else 11 - resto
# Calcula o segundo dígito verificador
soma = sum(int(cpf[i]) * (11 - i) for i in range(10))
resto = soma % 11
digito2 = 0 if resto < 2 else 11 - resto
# Verifica se os dígitos calculados conferem
return cpf[-2:] == f"{digito1}{digito2}"
Análise do código
re.sub(r'\D', '', cpf) remove tudo que não é dígito, aceitando entrada com ou sem pontuação.
cpf == cpf[0] * 11 rejeita sequências de dígitos repetidos comparando com uma string de 11 caracteres iguais.
O cálculo usa list comprehensions: sum(int(cpf[i]) * (10 - i) for i in range(9)) para o primeiro dígito (pesos 10 a 2) e sum(int(cpf[i]) * (11 - i) for i in range(10)) para o segundo (pesos 11 a 2). Cada resultado passa por % 11 com a regra do complemento.
cpf[-2:] compara os dois últimos dígitos com os calculados via f-string.
Uso
validar_cpf("529.982.247-25") # True
validar_cpf("111.111.111-11") # False
validar_cpf("52998224725") # True
Testes
Testes com pytest:
import pytest
def test_cpf_valido_com_pontuacao():
assert validar_cpf("529.982.247-25") is True
def test_cpf_valido_sem_pontuacao():
assert validar_cpf("52998224725") is True
def test_cpf_com_digitos_repetidos():
assert validar_cpf("111.111.111-11") is False
def test_cpf_com_digito_verificador_incorreto():
assert validar_cpf("529.982.247-26") is False
def test_cpf_com_tamanho_incorreto():
assert validar_cpf("123.456.789") is False
Para gerar CPFs válidos e alimentar seus testes, use o gerador de CPF online.