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

[Dúvida] Modo diferente no "Faça como eu fiz na aula"

Código

from validate_docbr import CPF, CNPJ


class Documento:
    def __init__(self, documento):
        self.documento = documento

    @staticmethod
    def cria_documento(documento):
        tipos_de_documentos = {
            11: Doc_cpf,
            14: Doc_cnpj,
            20: Doc_qualquer,
        }
        if len(documento) in tipos_de_documentos:
            tipo = tipos_de_documentos[len(documento)]
            return tipo(documento)
        else:
            raise ValueError('Quantidade de dígitos invalidos')

class Doc_qualquer:
    pass

class Doc_cpf:
    def __init__(self, documento):
        documento = str(documento)
        if self.valida(documento):
            self.cpf = documento
        else:
            raise ValueError("CPF inválido!")

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

    def valida(self, documento):
        validador = CPF()
        return validador.validate(documento)

    def format(self):
        format = CPF()
        return format.mask(self.cpf)


class Doc_cnpj(Documento):
    def __init__(self, documento):
        documento = str(documento)
        if self.valida(documento):
            self.cnpj = documento
        else:
            raise ValueError("CNPJ inválido!!")

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

    def valida(self, documento):
        validador = CNPJ()
        return validador.validate(documento)

    def format(self):
        format = CNPJ()
        return format.mask(self.cnpj)

Saída

Chamando variáveis no main.py:

from cpf_cnpj import Documento

cpf = '02947859731'
cnpj = '35379838000112'

doc = Documento.cria_documento(cpf)
doc2 = Documento.cria_documento(cnpj)

print(doc)
print(doc2)

Saída no Terminal:

029.478.597-31
35.379.838/0001-12

Minha Dúvida:

Na minha resolução, na função "cria_documento" eu fiz um dict(pois em teoria com um aumento de documentos seria mais fácil adiciona-los ao invés de encher de if's).

Porém, coloquei os valores da quantidade de caractere dos documentos como chave e o nome das funções como valores do dict, por conta de ser mais simples chamar as chaves depois através do tipo = tipos_de_documentos[len(documento)]. Isso pode ser considerado uma má prática? Já que o mais obvio seria ter os nomes das funções como as chaves e os valores do tamanho do documento como valores.

2 respostas
solução!

Olá José, como você está?

Você foi bem criativo ao utilizar um dicionário para armazenar as funções de validação de documentos e poder escolher a função a ser usada conforme o tamanho do documento.

Em relação à chave-valor do dicionário, como você fez não é necessariamente uma má prática, mas talvez não seja a mais intuitiva, pois é mais comum usar strings como chave, mas para o cenário que temos, o seu código cumpre bem com o objetivo.

A título de curiosidade, caso quisesse explorar chaves do dicionário que contenha o tipo do documento, o código seria similar ao apresentado abaixo:

class Documento:
    def __init__(self, documento):
        self.documento = documento

    @staticmethod
    def cria_documento(documento):
        tipos_de_documentos = {
            'cpf': Doc_cpf,
            'cnpj': Doc_cnpj,
            'qualquer': Doc_qualquer,
        }
        tamanho = len(documento)
        if tamanho in [11, 14]:
            tipo = tipos_de_documentos['cpf' if tamanho == 11 else 'cnpj']
            return tipo(documento)
        elif tamanho == 20:
            return tipos_de_documentos['qualquer'](documento)
        else:
            raise ValueError('Quantidade de dígitos inválida')

Espero ter ajudado. Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Em caso de dúvidas estou à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Felippe, estou ótimo e vc?

Minha duvida estava justamente sobre o caso de que utilizei um int como chave, ao invés de um str que é o mais comum kkkk pela resposta eu entendi o que vc quis dizer, mas ainda pensando num acréscimo de outros documentos, acredito que ainda assim iria ter que por vários if's para pegar a chave para o dicionário kkkk.

Mas de qualquer modo, foi esclarecedora a sua resposta, muito obrigado.