Gerar CPF em Python: Função com Testes pytest
Automatizar a geração de CPFs em Python é essencial quando scripts, APIs ou pipelines de dados precisam de números válidos sob demanda — sem depender de gerar CPF online. A função abaixo implementa o algoritmo de módulo 11 de forma limpa e idiomática.
Código
import random
def gerar_cpf() -> str:
digits = [random.randint(0, 9) for _ in range(9)]
soma1 = sum(d * (10 - i) for i, d in enumerate(digits))
r1 = soma1 % 11
d1 = 0 if r1 < 2 else 11 - r1
digits.append(d1)
soma2 = sum(d * (11 - i) for i, d in enumerate(digits))
r2 = soma2 % 11
d2 = 0 if r2 < 2 else 11 - r2
digits.append(d2)
return ''.join(str(d) for d in digits)
def validar_cpf(cpf: str) -> bool:
import re
clean = re.sub(r'[^\d]', '', str(cpf))
if len(clean) != 11:
return False
if clean == clean[0] * 11:
return False
soma1 = sum(int(clean[i]) * (10 - i) for i in range(9))
r1 = soma1 % 11
d1 = 0 if r1 < 2 else 11 - r1
if int(clean[9]) != d1:
return False
soma2 = sum(int(clean[i]) * (11 - i) for i in range(10))
r2 = soma2 % 11
d2 = 0 if r2 < 2 else 11 - r2
return int(clean[10]) == d2Análise do código
gerar_cpf usa list comprehension com random.randint(0, 9) para criar os 9 dígitos base. O primeiro verificador é calculado com sum() e enumerate(), aplicando módulo 11. O segundo verificador repete o cálculo com os 10 dígitos (incluindo o primeiro verificador).
validar_cpf limpa a entrada com re.sub, rejeita CPFs com todos os dígitos iguais (clean[0] * 11), e recalcula os dois verificadores. Está incluída como função auxiliar para os testes.
O retorno é sempre uma string de 11 caracteres, preservando zeros à esquerda. O uso de -> str e -> bool nas type hints segue as boas práticas do Python moderno.
Uso
cpf = gerar_cpf()
print(cpf) # "52998224725" (exemplo)
print(validar_cpf(cpf)) # TrueTestes
Testes com pytest:
def test_gerar_cpf_tem_11_digitos():
cpf = gerar_cpf()
assert len(cpf) == 11
assert cpf.isdigit()
def test_gerar_cpf_e_valido():
cpf = gerar_cpf()
assert validar_cpf(cpf) is True
def test_gerar_cpf_sao_diferentes():
cpfs = {gerar_cpf() for _ in range(50)}
assert len(cpfs) > 1Veja também: validar CPF em Python e o gerador de CPF online.