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