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

Argumento numérico começando com 0

Pessoal,

Quanto ao desafio proposto no exercício sobre métodos (Python 3 e OO), escrevi o seguinte código:

class Data:

    def __init__(self, dia, mes, ano):
        self.dia = int(dia)
        self.mes = int(mes)
        self.ano = int(ano)

    def formatada(self):
        print("{}/{}/{}".format(self.dia, self.mes, self.ano))

Funcionou, mas não como eu queria. O motivo? Eu não posso passar como argumento para a criação de um objeto um valor numérico iniciado por 0. Por exemplo, se eu fizer

from datas import Data
d = Data(02/11/1985)

recebo o seguinte erro:

 File "<stdin>", line 1 
    d = Data(02,11,1985) 
             ^ 
SyntaxError: invalid token

Como lidar com essa limitação? Se eu estivesse fazendo um código completo, trataria a entrada do usuário. Com o que temos de código, é possível contornar o problema?

Obrigado!

5 respostas
def formatada(self):
        print("{:02d}/{:02d}/{:02d}".format(self.dia, self.mes, self.ano))

Ola, eu tbm testei a sugestão do colega /Juliano/ mas infelizmente tbm deu errado na minha versão do python 3.6

Fui pesquisar e descobri que o python 3.x tem muito dificuldade em tratar integers acompanhado de zeros na frente, como o seu caso. Sendo válido apenas em strings "02".

Já o python 2.7 interpretava os integers acompanhados de zeros na frente em base octal.

Deixarei dois links pra aprofundar o estudo, da documentação do python na parte de strings, sugiro a leitura dos subtópicos 6.1.3.1 e 6.1.3.2[1] e uma discussão em fórum do stack overflow sobre o tema[2]:

[1] - https://docs.python.org/3.6/library/string.html#format-specification-mini-language

[2] - https://stackoverflow.com/questions/36386346/syntaxerror-invalid-token

Caro Juliano,

A sua solução foi uma das que eu implementei e, de fato, penso até ser melhor do que a que eu coloquei no meu post original. Infelizmente, ela não resolve o problema do 0 em frente, mas eu agradeço a sugestão :)

Obrigado e um abraço!

Caro Natan,

Obrigado pelas dicas! Li o material que você enviou e estou de acordo com a sua interpretação: o Python 3 possui essa limitação. Parece que o ideal seria o tratamento da entrada do usuário, antes de passar os valores para o método da minha classe, certo?

Obrigado e um abraço!

solução!

A realidade é que zeros à esquerda não são permitidos em Python3 (para números, obviamente). No entanto, a entrada do usuário (via input) é uma String. Podemos perfeitamente ter a string '02'. No entanto quando convertemos para int:

int("02")

obviamente é convertido para o inteiro 2

quando fazemos

print("{:02d}/{:02d}/{:02d}".format(2, 2, 2))

estamos dizendo que converteremos os números para a string com no mínimo dois dígitos e que caso seja menor que 2 dígitos, devemos preencher o lado esquerdo com '0'.

Funciona perfeitamente no Python3