Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Detectar automaticamente se é cnpj ou CPF (simples)

Fiz assim, sei que precisaria de mais validações, mas ficou bacana:

from validate_docbr import CPF as cpf
from validate_docbr import CNPJ


class CPF_CNPJ:
    def __init__(self, documento):
        tamanho = len(str(documento))
        if self.valida_documento(documento):
            self.cpf = str(documento)
        elif self.valida_cnpj(documento):
            self.cnpj = str(documento)

        else:
            if tamanho == 11:
                raise ValueError('Cpf inválido.')
            elif tamanho == 14:
                raise ValueError('CNPJ inválido.')
            else: raise ValueError('Quantidade de digitos inválida.')

    def __str__(self):
        if hasattr(self, 'cnpj'):
            return self.formatar_cnpj()
        else:
            return self.formatar_cpf()

    def valida_documento(self, documento):
        if len(str(documento)) == 11:
            valida = cpf()
            return valida.validate(str(documento))

    def formatar_cpf(self):
        # ou faria instanciado masking = cpf()
        # masking.mask(self.cpf)
        return cpf().mask(self.cpf)

    def formatar_cnpj(self):
        return CNPJ().mask(self.cnpj)

    def valida_cnpj(self, cnpj):
        if len(str(cnpj)) == 14:
            validator = CNPJ()
            return validator.validate(str(cnpj))

4 respostas

Sim, ficou bacana. Você conseguiu imprimir até o endereço do CPF. Como conseguiu fazer isso? Usou um banco de dados? API?

O endereço ?? Não cheguei a implementar isso não haha, onde viu ?

Desculpe, meu PyCharm havia rodado o exercício mais avançado de CEP, o qual já terminei, desse curso de validação de dados brasileiros.

Seu código está funcionando normalmente, mas não precisa mostrar endereço nenhum, pois isso é outra coisa.

Sugiro que quebre linha do else depois da linha 18. Durante a formação de Python orientado a objetos, ficará recomendado para nós estudantes que nossas classes não devem ter mais de uma função (devem ser "coesas"). Apesar de seu código estar rodando, até onde testei, é recomendado que você crie classes separadas para CNPJ e CPF, pois assim ficará mais organizado, uma vez que não terá duas funções ao mesmo tempo.

Você irá fazer uma classe que contenha outras duas classes para CPF e CNPJ depois, obedecendo à condição do número de caracteres.

solução!

Shoow, refatorei ontem acabando o curso

from validate_docbr import CPF as cpf
from validate_docbr import CNPJ as cnpj
class Documento:
    @staticmethod
    def cria_documento(documento):
        tamanho = len(str(documento))
        if tamanho == 11:
            return CPF(documento)
        elif tamanho == 14:
            return CNPJ(documento)
        else:
            raise ValueError("Dado digitado inválido. (quantidade)")


class CPF():
    def __init__(self, documento):
        documento = str(documento)
        if self.valida_doc(documento):
            self.doc = documento
        else:
            raise ValueError("Cpf inválido.")

    def valida_doc(self, documento):
        return cpf().validate(documento)

    def __str__(self):
        return self.masking_doc()

    def masking_doc(self):
        return cpf().mask(self.doc)


class CNPJ():
    def __init__(self, documento):
        documento = str(documento)
        if self.valida_doc(documento):
            self.doc = documento
        else:
            raise ValueError("CNPJ inválido.")

    def valida_doc(self, documento):
        return cnpj().validate(documento)

    def __str__(self):
        return self.masking_doc()

    def masking_doc(self):
        return cnpj().mask(self.doc)

Valeeeu !

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software