es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo convertir una cadena a una fecha y hora sin utilizar múltiples bloques de try…except anidados?

Estoy tratando de verificar la entrada de un usuario de una fecha/hora en varios formatos permitidos. (Sé acerca de la librería dateutil. No es lo que estoy buscando en este caso.)

Si se acepta alguna entrada de usuario, la función debe devolver un objeto datetime.

Si TODOS los bloques “try…except” fallan, la función debe devolver NONE. Pero tengo entre 30 y 50 formatos diferentes de fecha/hora que necesito verificar.

¡Estoy confundido por la identación enorme en mi código! ¿Cómo organizo esta verificación de formato de una buena manera con BUEN rendimiento?

Programa de prueba de verificación de formatos

import datetime

def comprobacion_formato_fecha_hora(str):
try:
dt = datetime.datetime.strptime(str, “%y-%m-%d %H:%M”)
return dt
except:
try:
dt = datetime.datetime.strptime(str, “%Y-%m-%d %H:%M”)
return dt
except:
try:
dt = datetime.datetime.strptime(str, “%y-%m-%d”)
return dt
except:
try:
dt = datetime.datetime.strptime(str, “%Y-%m-%d”)
return dt
except:
try:
dt = datetime.datetime.strptime(str, “%H:%M”)
return dt
except:
try:
# . . .
# muchos bloques try…except )))
# . . .
return None # último except muy lejos de la borda de la pantalla. ))))

while True:
str = input(“Ingresa la fecha: “)
print(“Resultado: “, comprobacion_formato_fecha_hora(str))

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para organizar la comprobación de formato de manera eficiente y con buen rendimiento, considera usar una lista de cadenas de formato para iterar en lugar de bloques anidados de try…except. Esto reducirá la indentación y simplificará el código.

    Aquí tienes un ejemplo de implementación:

    import datetime
    
    def datetime_format_check(user_input):
        formatos = ["%y-%m-%d %H:%M", "%Y-%m-%d %H:%M", "%y-%m-%d", "%Y-%m-%d", "%H:%M"]
        for formato in formatos:
            try:
                return datetime.datetime.strptime(user_input, formato)
            except ValueError:
                pass
        return None
    
    while True:
        user_input = input("Ingresa la fecha: ")
        print("Resultado:", datetime_format_check(user_input))
    

    En lugar de anidar varios bloques try…except, se utiliza un bucle for para iterar a través de cada cadena de formato en la lista. El objeto datetime se devuelve tan pronto como una de las cadenas de formato tenga éxito, o se devuelve None si ninguna de las cadenas de formato tiene éxito.

    Al usar una lista de cadenas de formato y recorrerlas en un bucle, el código se vuelve más conciso y más fácil de leer. También mejora el rendimiento al eliminar bloques innecesarios de try…except anidados.

Comments are closed.