associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "VerificadorDeCPF"

Diferenças entre as versões de 5 e 6
Revisão 5e 2010-05-05 21:31:06
Tamanho: 3071
Editor: italo.maia
Comentário: corrigido método _translate e assert para cpf inválido.
Revisão 6e 2010-05-15 06:16:42
Tamanho: 3016
Editor: newacct
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 23: Linha 23:
    for i in range(len(cpf)):
        a = cpf[i]
    for i, a in enumerate(cpf):
Linha 73: Linha 72:
        return "CPF('%s')" % ''.join([str(x) for x in self.cpf])         return "CPF('%s')" % ''.join(str(x) for x in self.cpf)
Linha 80: Linha 79:
        if isinstance(other, CPF):
           return self.cpf == other.cpf
        return False
        return isinstance(other, CPF) and self.cpf == other.cpf

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