Advertisement
teslariu

decoradores

Sep 5th, 2023
1,169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.78 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. #  decoradores.py
  5. #  
  6. import functools
  7. import time
  8.  
  9. def decorador(funcion):
  10.     # Plantilla estandar para construir decoradores
  11.     @functools.wraps(funcion)
  12.     def wrapper_decorador(*args, **kwargs):
  13.         # hace algo antes
  14.         valor = funcion(*args, **kwargs)
  15.         # hacer algo despues
  16.         return valor
  17.     return wrapper_decorador
  18.  
  19.  
  20. def duplicar_borrador(funcion):
  21.     def wrapper_duplicar():
  22.         funcion()
  23.         funcion()
  24.     return wrapper_duplicar
  25.  
  26.  
  27. def duplicar(funcion):
  28.     def wrapper_duplicar(*args, **kwargs):
  29.         funcion(*args, **kwargs)
  30.         funcion(*args, **kwargs)
  31.     return wrapper_duplicar
  32.    
  33.    
  34. def debug(funcion):
  35.     """Imprime la firma de la función y su valor de retorno"""
  36.     @functools.wraps(funcion)
  37.     def wrapper_debug(*args, **kwargs):
  38.         # creo una lista de argumentos posicionales de la función
  39.         args_repr = [repr(a) for a in args]
  40.        
  41.         # creo una lista de argumentos keywords
  42.         kwargs_repr = [f"{k} = {w}" for k,v in kwargs.items()]
  43.        
  44.         # unimos los argumentos con la firma
  45.         firma = ",".join(args_repr + kwargs_repr)
  46.         print(f"Llamando a la función {funcion.__name__}({firma})")
  47.         valor = funcion(*args, **kwargs)
  48.         print(f"La función {funcion.__name__} devolvió {valor}")
  49.         return valor
  50.     return wrapper_debug
  51.        
  52.    
  53. def timer(funcion):
  54.     """Imprime el tiempo de ejecuciòn de la función decorada"""  
  55.     @functools.wraps(funcion)
  56.     def wrapper_timer(*args, **kwargs):
  57.         # almacena el instante inicial
  58.         start_time = time.perf_counter()
  59.         valor = funcion(*args, **kwargs)
  60.         # almacena el instante final
  61.         end_time = time.perf_counter()
  62.         run_time = end_time - start_time
  63.         print(f"tiempo de ejecución: '{funcion.__name__}' en {run_time:.4f} segundos")
  64.         return valor
  65.     return wrapper_timer
  66.    
  67.    
  68.    
  69.    
  70.    
  71.    
  72.    
  73.    
  74.    
  75.    
  76.    
  77.        
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement