3
respostas

Problema com o construtor ao instanciar objetos do tipo CPF iniciados por zero.

class Cpf: def init(self, documento): documento = str(documento)

Comentário: Observei que ao instanciar um objeto numa classe, o primeiro método a ser executado é o construtor (init). Portanto, se quisermos instanciar cpf do tipo inteiro e iniciados por zero, ocorrerá o seguinte erro: " SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers ". Isso se dá em razão da ordem de execução do código: sempre de cima pra baixo. Logo, não é possível fazer: documento = str(documento) antes de: def init(self, documento):

Nos exercícios da plataforma conseguimos fazer a formatação dos dados de entrada para string, mas não é possível fazer isso antes do construtor ser acionado, portanto me pego preso nisso.

3 respostas

To tentando entender o seu problema, qual seria o exercicio e como realmente ta sua classe?

class Documento:

    @staticmethod
    def cria_documento(documento):
        documento = str(documento)
        if len(documento) == 11:
            return DocCpf(documento)
        elif len(documento) == 14:
            return DocCnpj(documento)
        else:
            raise ValueError('Quantidade de dígitos incorreta')


class DocCpf:
    def __init__(self, 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):
        mascara = CPF()
        return mascara.mask(self.cpf)


class DocCnpj:
    def __init__(self, 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):
        mascara = CNPJ()
        return mascara.mask(self.cnpj)

Usando o código, tente instanciar um objeto do tipo int na classe documento. Você verá o erro: SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers. Pelo que eu entendi, isso ocorre porque no python não permite que iniciemos número naturais com zero. Exemplo: 0100. É permitido apenas escrever 100.

Existe alguma resolução para esse problema ou precisamos "forçar" o usuário a digitar o cpf ou cnpj sempre em formato de string usando aspas?