1
resposta

diminuir codigo

ola boa tarde, crie uma classe que pega data imprime e verefica se a data e coesa porem a parte da vereficação ficou muito extensa, queria saber se tem como diminuir-la, e se tem poderia me informar?

segue codigo:

class Data_Hora():
    def __init__(self, dia, mes, ano, hora, minuto):
        self.d_e_h = {'dia':dia, 'mes':mes, 'ano':ano, 'hora':hora, 'minuto':minuto}

    def __str__(self):
        a = str("{}/{}/{}\n{}:{}".format(self.d_e_h['dia'], self.d_e_h['mes'], self.d_e_h['ano'],
                                  self.d_e_h['hora'], self.d_e_h['minuto']))
        return a

    def __format__(self, format_spec):
        return self.d_e_h == str

    def vereficação(self):
        while self.d_e_h:
            if 'dia'.__ge__(32):
                print("dia invalido")
                break
            elif 'mes'.__ge__(13):
                print("mes invalido")
                break
            elif 'ano' == None:
                print('ano invalido')
                break
            elif 'hora'.__ge__(25):
                print("hora invalida")
                break
            elif 'minuto'.__ge__(61):
                print('minuto invalido')
                break
            else:
                break
1 resposta

Olá João, tudo bem com você?

Peço desculpas pela demora em lhe responder.

No Python temos a biblioteca datetime que permite trabalharmos com a manipulação e validação de data e horas com uma maior facilidade. Por ser um recurso no formato estrangeiro, devemos informar os valores na seguinte ordem: ano, mês, dia, hora, minutos:

Modelo1

import datetime

data = datetime.datetime(2022, 12, 1, 13, 11)

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

Resultado

01/12/2022 13:11

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.: 2022
  • %H significa hora entre 00 e 23
  • %M significa minutos

Caso alguma regra das apresentadas acima seja burlada, obteremos o erro de ValueError, como mostro abaixo:

import datetime

data = datetime.datetime(2022, 12, 40, 13, 11)

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

Resultado

ValueError: day is out of range for month

Ou seja, o dia está fora do range permitido.

Modelo 2

Uma forma alternativa utilizando orientação a objetos, seria a demonstrada abaixo, onde utilizamos os setters para validar determinada regra:

class DataHora:
    def __init__(self, dia, mes, ano, hora, minuto):
        self.dia = dia
        self.mes = mes
        self.ano = ano
        self.hora = hora
        self.minuto = minuto

    def tempo(self):
        return print(f'Hoje é dia: {self.dia:02d}/ {self.mes:02d}/ {self.ano} - {self.hora:02d}:{self.minuto:02d}')

    @property
    def dia(self):
        return self.__dia

    @property
    def mes(self):
        return self.__mes

    @property
    def ano(self):
        return self.__ano

    @property
    def hora(self):
        return self.__hora

    @property
    def minuto(self):
        return self.__minuto

    @dia.setter
    def dia(self, novo_dia):
        self.__dia = novo_dia if 0 < novo_dia < 31 else exec("raise ValueError('Dia inválido')")

    @mes.setter
    def mes(self, novo_mes):
        self.__mes = novo_mes if 0 < novo_mes <= 12 else exec("raise ValueError('Mês inválido')")

    @ano.setter
    def ano(self, novo_ano):
        self.__ano = novo_ano

    @hora.setter
    def hora(self, nova_hora):
        self.__hora = nova_hora if 0 <= nova_hora <= 24 else exec("raise ValueError('Hora inválida')")

    @minuto.setter
    def minuto(self, novo_minuto):
        self.__minuto = novo_minuto if 0 <= novo_minuto <= 59 else exec("raise ValueError('Minuto inválido')")


data = DataHora(1, 12, 2022, 22, 2)
data.tempo()

Resultado

Hoje é dia: 01/ 12/ 2022 - 22:02

Para saber um pouco mais sobre a biblioteca datetime, recomendo a leitura dos seguintes artigos:

O segundo artigo está em inglês, caso tenha dificuldade com o idioma, recomendo o uso do tradutor do navegador.

Fico à disposição em caso de dúvidas.

Abraços e bons estudos.

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

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