Receita: Verificador de CPF
Esse módulo contém algumas funções e classes úteis para aplicações que envolvam cadastros e necessitem validar números de CPF antes de incluir no banco de dados. Além de útil, também é um bom exemplo de como otimizar código que lida com manipulação de números e strings, usando as funções sum(), map() e list compreensions.
Código
1 #/usr/bin/env python
2 # -*- coding:UTF-8 -*-
3 # fonte: http://www.python.org.br/wiki/VerificadorDeCPF
4
5 import re
6
7 # traduz 123.456.789-10 para 12345678910
8 _translate = lambda cpf: ''.join(re.findall("\d", cpf))
9
10 def _gen(cpf):
11 """Gera o próximo dígito do número de CPF
12
13 """
14 res = []
15 for i, a in enumerate(cpf):
16 b = len(cpf) + 1 - i
17 res.append(b * a)
18
19 res = sum(res) % 11
20
21 if res > 1:
22 return 11 - res
23 else:
24 return 0
25
26
27 class CPF(object):
28
29 _gen = staticmethod(_gen)
30 _translate = staticmethod(_translate)
31
32 def __init__(self, cpf):
33 """O argumento cpf pode ser uma string nas formas:
34
35 12345678910
36 123.456.789-10
37
38 ou uma lista ou tuple
39 [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0]
40 (1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0)
41
42 """
43
44 if isinstance(cpf, basestring):
45 if not cpf.isdigit():
46 cpf = self._translate(cpf)
47
48 self.cpf = [int(x) for x in cpf]
49
50 def __getitem__(self, index):
51 """Retorna o dígito em index como string
52
53 """
54
55 return self.cpf[index]
56
57 def __repr__(self):
58 """Retorna uma representação 'real', ou seja:
59
60 eval(repr(cpf)) == cpf
61
62 """
63
64 return "CPF('%s')" % ''.join(str(x) for x in self.cpf)
65
66 def __eq__(self, other):
67 """Provê teste de igualdade para números de CPF
68
69 """
70
71 return isinstance(other, CPF) and self.cpf == other.cpf
72
73 def __str__(self):
74 """Retorna uma representação do CPF na forma:
75
76 123.456.789-10
77
78 """
79
80 d = iter("..-")
81 s = map(str, self.cpf)
82 for i in xrange(3, 12, 4):
83 s.insert(i, d.next())
84 r = ''.join(s)
85 return r
86
87 def isValid(self):
88 """Valida o número de cpf
89
90 """
91
92 s = self.cpf[:9]
93 s.append(self._gen(s))
94 s.append(self._gen(s))
95 return s == self.cpf[:]
Exemplo de uso
1 #/usr/bin/env python
2 # -*- coding:UTF-8 -*-
3
4
5 from cpf import CPF
6
7 # Estes números foram gerados aleatoriamente :)
8
9 VALIDO = "113.451.253-80"
10 INVALIDO = "31354110274"
11
12 # qualquer um dos dois formatos (com pontos ou não) pode ser usado
13
14 valido = CPF(VALIDO)
15 invalido = CPF(INVALIDO)
16
17 assert valido.isValid()
18 assert invalido.isValid()
Volta para CookBook.
Pedro Werneck
edit 05/05/2010: Italo Maia