1+ import os , platform ,logging
2+
3+ if (platform .platform ().startswith ("macOS" ) or platform .platform ().startswith ("Linux" )):
4+ os .system ('clear' )
5+ else :
6+ os .system ('cls' )
7+
8+
9+ """ * EJERCICIO:
10+ * Explora el concepto de "logging" en tu lenguaje. Configúralo y muestra
11+ * un ejemplo con cada nivel de "severidad" disponible.
12+ *
13+ """
14+
15+
16+ #Valores representativos en número de cada nivel de severidad
17+ #NONSET = 0
18+ #DEBUG = 10
19+ #INFO = 20
20+ #WARNING = 30
21+ #ERROR = 40
22+ #CRITICAL = 50
23+
24+ LEVELS = {
25+ 'notset' : logging .NOTSET ,
26+ 'debug' : logging .DEBUG ,
27+ 'info' : logging .INFO ,
28+ 'warning' : logging .WARNING ,
29+ 'error' : logging .ERROR ,
30+ 'critical' : logging .CRITICAL ,
31+ }
32+
33+ level = LEVELS .get ('debug' )#Podemos establecer el nivel mínimo de severidad desde una variable
34+
35+
36+ logging .basicConfig (
37+ #filename="#25.log", #Podemos creal un fichero con extensión .log para almacenar los mensajes de logging
38+ #filemode= "a", # Con el modo "a" añadimos siempre al final del fichero los nuevos mensajes, con "w" solo se guradan los últimos mensajes
39+ encoding = "utf-8" ,
40+ level = level ,#Tambien podemos asignar a la clave level del diccionario de configuración básico el propio nivel
41+ # así: level=logging.DEBUG o con su valor numérico así: level=10
42+ format = "%(asctime)s,%(msecs)1d - %(levelname)s %(message)s" ,#En format determinamos el formato del mensaje de logging
43+ datefmt = '%d-%B-%Y,%H:%M:%S' #En datefmt le damos formato concreto a la fecha y hora igual que haríamos con datetime.datetime.strftime()
44+ )
45+
46+
47+ def division (a :int , b :int )-> int :
48+ try :
49+ result = round ((a / b ),2 )
50+ logging .info (f"División de { a } entre { b } . Resultado: { result } , operación correcta" )
51+ #Mensaje de logging formateado para mostrar si el resultado de la función es correcto
52+ except ZeroDivisionError as zero :
53+ result = None
54+ logging .error (zero )
55+ except TypeError as type :
56+ result = None
57+ logging .error (type )
58+
59+ return result
60+
61+ def to_upper (text :str )-> str : #Podemos prevenir los posibles errores dentro de las funciones con generación de mensajes de logging
62+ try :
63+ text = text * 2
64+ text = text .upper ()
65+
66+ logging .info (text )
67+ except ValueError as val :
68+ text = None
69+ logging .warning (val ) #Dentro de una excepción específica..
70+ except Exception as ex :
71+ text = None
72+ logging .warning (ex ) # o dentro de una excepción genérica
73+
74+ return text
75+
76+ def show_element (my_list :list ,index :int )-> int :
77+ try :
78+ num = my_list [index ]
79+ logging .info (f"El índice { index } de la lista { my_list } es { num } " )
80+ #Mensaje de logging formateado para mostrar si el resultado de la función es correcto
81+ except IndexError as indexerr :
82+ num = None
83+ logging .critical (indexerr )
84+
85+
86+
87+ try :
88+ division (8 , 3 )#Función con valores válidos para una división
89+ division (2 , 0 )#Aquí provocamos un error de division entre cero
90+ division (9 , "3" )#Aquí provocamos un error de tipo de dato
91+ print ()
92+ show_element ([1 ,2 ,3 ],2 )#Función con valores correctos para mostrar un elemento de una lista
93+ show_element ([1 ,2 ,3 ],3 )#Aquí provocamos un error de fuera de índice
94+ print ()
95+ to_upper (45 )#Provocamos un error porque aunque un int admite multiplicación no admite el método .upper()
96+ to_upper ("Hola Python " )#Aquí le pasamos un string que admite multiplicación y método .upper()
97+ to_upper ("Hola" , "Python" )#Aquí provocamos que no se pueda ejecutar la función y el programa salta al except,
98+ # si pusiéramos esta llamada al principio de esta lista no se ejecutaría ninguna llamada
99+
100+ except Exception as ex :
101+ logging .warning (ex )
102+ print ("excepción general antes de la función" )
103+ #Tambien podemos prevenir los errores que no permiten ejecutar la función como en el caso de
104+ # to_upper() al que le estamos pasando 2 argumentos cuando requiere solo uno
105+
106+
107+ #Tambien podemos generar mensajes de logging no relacionados con la propia ejecución como este que
108+ # nos da información del sistema operativo , su versión y la versión en este caso de python que estamos usando
109+ logging .info (f"Runnig at: { platform .platform ()} with Python { platform .python_version ()} " )
110+
111+
112+ """ * DIFICULTAD EXTRA (opcional):
113+ * Crea un programa ficticio de gestión de tareas que permita añadir, eliminar
114+ * y listar dichas tareas.
115+ * - Añadir: recibe nombre y descripción.
116+ * - Eliminar: por nombre de la tarea.
117+ * Implementa diferentes mensajes de log que muestren información según la
118+ * tarea ejecutada (a tu elección).
119+ * Utiliza el log para visualizar el tiempo de ejecución de cada tarea."""
120+
121+
122+ tasks = {}
123+
124+ def add_task (task :str ,description :str ):
125+ tasks [task ]= description
126+ logging .info (f"La tarea { task } se ha añadido correctamente\n " )
127+
128+ def show_tasks ():
129+ [print ("Tarea: " , t ,"- Descripción: " , d , end = '\n ' ) for t ,d in tasks .items ()]
130+ print ()
131+
132+ def delete_task (task :str ):
133+ if task in tasks :
134+ tasks .pop (task )
135+ logging .info (f"La tarea { task } ha sido eliminada correctamente\n " )
136+ else :
137+ logging .warning (f"Tarea { task } no encontrada\n " )
138+
139+
140+ while True :
141+ option = input ("-1 Mostrar tareas \n -2 Añadir tarea \n -3 Borrar tarea \n -4 Salir\n Seleccione una opción: " )
142+ if not option .isdigit ():
143+ logging .error (": Sólo se pueden introducir caracteres numéricos, intente de nuevo\n " )
144+ elif int (option )< 1 or int (option )> 4 :
145+ logging .warning (": El número no debe ser diferente a las opciones mostradas, intente de nuevo\n " )
146+ else :
147+ option = int (option )
148+
149+ if option == 1 :
150+ logging .debug ("listado de tareas:" )
151+ show_tasks ()
152+ continue
153+ elif option == 2 :
154+ task_name = input ("Escriba el nombre de la tarea: " )
155+ task_desc = input ("Describa la tarea: " )
156+ add_task (task_name ,task_desc )
157+ continue
158+ elif option == 3 :
159+ task_name = input ("Escriba el nombre de la tarea a borrar: " )
160+ delete_task (task_name )
161+ continue
162+ elif option == 4 :
163+ logging .warning (": Está saliendo del programa" )
164+ break
165+
166+
0 commit comments