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

[Projeto] Resolução do Projeto com Sugestões

Acredito que alguns dos alunos assim como eu devam ter se deparado com o seguinte erro:

leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers

o que pode ser resolvido com a formatação de duas casas decimais.

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

Também utilizei algumas condições de decisão para reduzir a possibilidade de erros.

Outro ponto importante é que não utilizei o função sep=("/") pois não encontrei um jeito de colocá-la junto as formatações de duas casas optando por inserir / manualmente na função print()

Se álguem souber algum modo de implementar por favor poste abaixo.

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

    def valida(self):
        if (self.dia < 1) or (self.dia > 31):
            print("dia inválido")
        elif (self.mes < 1) or (self.mes > 12):
            print("mês inválido")
        elif (self.ano < 1):
            print("ano inválido")
        else:
            print("{:02d}/{:02d}/{}".format( self.dia, self.mes, self.ano))
2 respostas
solução!

Olá Juliano, tudo bem com você?

Meus parabéns pela implementação do código da atividade, fico feliz que tenha compartilhado-o com a comunidade do fórum Alura. Sua explicação ficou excelente, ela irá contribuir bastante para o desenvolvimento de todos os alunos e alunas que lerem sua postagem.

Gostaria de aproveitar a oportunidade e deixar uma dica de implementação. No Python temos a biblioteca datetime que permite trabalharmos com a manipulação e validação de data e horas com uma maior facilidade, assim, podemos trabalhar com as exceções e levantamento de erros de uma forma prática.

Para implementar o uso da biblioteca datetime na classe Data e criarmos uma validação das datas e realizar o levantamento de erro e exceções usaremos as cláusulas try / except. Com isso, o método inicializador irá tentar (try) criar um objeto com a biblioteca datetime exceto (except) quando essa tentativa elevar erro de valor (ValueError).

Essa implementação será feita no método inicializador (__init__) como apresentado abaixo:

def __init__(self, ano, mes, dia, hora, minuto):
    try:
        self.data = datetime.datetime(ano, mes, dia, hora, minuto)
    except ValueError as e:
        raise ValueError(e)

No código acima, será realizada a tentativa da declaração do atributo data, exceto quando os valores informados geram erro.

Para exibir a data com a formatação, usaremos o método strftime da biblioteca datetime. Como apresentado abaixo.

def formata(self):
    print(self.data.strftime('%d/%m/%Y %H:%M'))

No código acima é utilizado códigos de formatação para transformar a saída no padrão Brasileiro, onde:

  • %d significa dia entre 01 e 31
  • %m significa número do mês
  • %Y significa ano, com a versão completa, Ex.: 2023
  • %H significa hora entre 00 e 23
  • %M significa minutos

Caso alguma regra das apresentadas acima seja burlada, obteremos o erro de ValueError.

Por ser um recurso no formato estrangeiro, no momento da criação do objeto devemos informar os valores na seguinte ordem: ano, mês, dia, hora, minutos. Como apresentado abaixo.

data = Data(2023, 1, 21, 7, 0)

Código completo com as mudanças necessárias

import datetime


class Data:
    def __init__(self, ano, mes, dia, hora, minuto):
        try:
            self.data = datetime.datetime(ano, mes, dia, hora, minuto)
        except ValueError as e:
            raise ValueError(e)

    def valida(self):
        print(self.data.strftime('%d/%m/%Y %H:%M'))


data = Data(2023, 1, 21, 7, 0)
data.valida()

Resultado

21/01/2023 07:00

Para aprimorar ainda mais o seu aprendizado sobre a biblioteca datetime, recomendo a leitura dos artigos abaixo, onde será abordado com detalhes sobre o uso e aplicações dessa biblioteca.

O segundo artigo recomendado acima está em inglês, o uso da língua inglesa é bem comum na área de tecnologia, mas não se preocupe, caso não tenha afinidade com essa linguagem, recomendo que utilize o tradutor do navegador para uma melhor compressão.

Lembre-se que pode contar sempre com o fórum Alura, seja para compartilhar o seu desenvolvimento ou para tirar suas dúvidas.

Fico à disposição.

Abraços e bons estudos.

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

Obrigado pela dica ja implementei o novo código. utilizei somente D,M e A para cumprir com o requisitado do exercício.

import datetime


class Data:
    def __init__(self, ano, mes, dia):
        try:
            self.data = datetime.datetime(ano, mes, dia)
        except ValueError as e:
            raise ValueError(e)

    def valida(self):
        # poderia utilizar horas e minutos também
        print(self.data.strftime('%d/%m/%Y'))