Olá, Vinicius. Como vai?
Excelente pergunta! Essa é uma dúvida muito comum quando saímos dos exercícios de lógica básica e começamos a desenhar sistemas que simulam o mundo real (como uma catraca física ou um sistema de ponto de um escritório).
No dia a dia do desenvolvimento, dados de horários vindos de terminais, APIs ou relógios de ponto chegam quase sempre como um texto (String), exatamente no formato "12:30".
Tentar converter "12:30" direto para int() ou float() vai disparar o bloco except ValueError que você programou, porque o caractere de dois-pontos (:) não pertence a esses tipos numéricos.
Existem duas abordagens excelentes no Python para tratar esse cenário. Vamos entender como cada uma funciona.
Abordagem 1: Usando a biblioteca nativa datetime (Recomendada)
A melhor prática de mercado em Python é utilizar o módulo nativo datetime. Ele possui uma função fantástica chamada strptime (abreviação de string parse time), que serve especificamente para ler um texto e transformá-lo em um objeto de horário que o Python entende nativamente.
Veja como o seu código pode ser adaptado usando essa abordagem:
import os
from datetime import datetime, time
def ponto_de_acesso():
# Definindo os limites de horário usando objetos do tipo time (Hora, Minuto)
abertura = time(8, 0)
fechamento = time(18, 0)
while True:
os.system("cls" if os.name == "nt" else "clear")
entrada = input("Digite a hora atual (ex: 12:30) ou -1 para sair: ").strip()
if entrada == "-1":
break
try:
# Converte a string "12:30" em um objeto de horário baseado no formato %H:%M
hora_atual = datetime.strptime(entrada, "%H:%M").time()
# Agora a comparação avalia tanto as horas quanto os minutos de forma precisa
if abertura <= hora_atual < fechamento:
print("Acesso permitido.")
else:
print("Acesso negado.")
except ValueError:
print("Erro: Por favor, digite o horário no formato correto de 24h (ex: 08:30, 17:45).")
input("\nPressione Enter para continuar...")
ponto_de_acesso()
Por que essa é a melhor abordagem?
O objeto time do Python já cuida de todas as validações difíceis para você. Se o usuário digitar um horário impossível como "25:70", o próprio strptime percebe a inconsistência e joga o programa direto para o seu except ValueError, exibindo a mensagem de erro amigável sem quebrar o sistema.
Abordagem 2: Quebrando a String com .split() (Abordagem de pura lógica)
Se você preferir resolver o problema apenas usando estruturas básicas de manipulação de texto e operadores matemáticos (sem importar bibliotecas), você pode usar o método .split(":").
Ele "corta" a string onde houver dois-pontos e devolve uma lista com duas partes textuais: a hora e o minuto. A partir daí, você converte as duas partes para números inteiros.
Veja como ficaria a lógica do tratamento:
entrada = "12:30"
# O split transforma "12:30" em uma lista: ["12", "30"]
partes = entrada.split(":")
if len(partes) == 2:
hora = int(partes[0])
minuto = int(partes[1])
# Validação manual das fronteiras do relógio
if 0 <= hora <= 23 and 0 <= minuto <= 59:
# Cria um valor numérico comparável (ex: 12h e 30min vira 12.5)
hora_com_minuto = hora + (minuto / 60)
if 8 <= hora_com_minuto < 18:
print("Acesso permitido.")
else:
print("Acesso negado.")
else:
print("Horário inválido (valores fora do padrão de 24h).")
Qual escolher?
No mercado, a Abordagem 1 com datetime é amplamente preferida. Além de deixar o seu código mais limpo, ela evita que você precise escrever validações manuais gigantescas para verificar se os minutos estão entre 0 e 59 ou se as horas estão entre 0 e 23.
Seu código original está excelente, muito bem estruturado com o tratamento de exceções e a limpeza de terminal. Adicionar o tratamento de strings vai deixar ele pronto para um cenário real!
Espero que possa ter lhe ajudado!