Decorador para imprimir detalles de llamadas a funciones en Python

Los decoradores en Python son el patrón de diseño que permite a los usuarios agregar nuevas funcionalidades a un objeto existente sin necesidad de modificar su estructura. Los decoradores generalmente se llaman antes de definir una función que el usuario desea decorar.

Ejemplo:

# defining a decorator 
def hello_decorator(func): 
    
    # inner1 is a Wrapper function in  
    # which the argument is called 
        
    # inner function can access the outer local 
    # functions like in this case "func" 
    def inner1(): 
        print("Hello, this is before function execution") 
    
        # calling the actual function now 
        # inside the wrapper function. 
        func() 
    
        print("This is after function execution") 
            
    return inner1 
    
    
# defining a function, to be called inside wrapper 
def function_to_be_used(): 
    print("This is inside the function !!") 
    
    
# passing 'function_to_be_used' inside the 
# decorator to control its behavior 
function_to_be_used = hello_decorator(function_to_be_used) 
    
    
# calling the function 
function_to_be_used() 
Producción:

Hello, this is before function execution
This is inside the function !!
This is after function execution

Nota: Para obtener más información, consulte Decoradores en Python

Decorador para imprimir los detalles de la llamada de función

Consideremos un escenario en el que ha escrito un código muy extenso y desea conocer los detalles de la llamada a la función. Entonces, lo que puede hacer es desplazarse por su código todas y cada una de las diferentes funciones para conocer sus detalles o puede trabajar de manera inteligente. Puede crear un decorador que pueda imprimir los detalles de cualquier función que desee.

Para ello las funciones en Python tienen ciertos atributos. Uno de esos atributos es __code__que devuelve el bytecode de la función llamada. Los __code__atributos también tienen ciertos atributos que nos ayudarán en la realización de nuestras tareas. Usaremos el co_varnamesatributo que devuelve la tupla de nombres de argumentos y variables locales y co_argcountque devuelve el número de argumentos (sin incluir argumentos de solo palabras clave, * o ** args). Veamos la implementación a continuación de dicho decorador usando estos atributos discutidos.

Ejemplo:

# Decorator to print function call
# details
def function_details(func):
      
      
    # Getting the argument names of the
    # called function
    argnames = func.__code__.co_varnames[:func.__code__.co_argcount]
      
    # Getting the Function name of the
    # called function
    fname = func.__name__
      
      
    def inner_func(*args, **kwargs):
          
        print(fname, "(", end = "")
          
        # printing the function arguments
        print(', '.join( '% s = % r' % entry
            for entry in zip(argnames, args[:len(argnames)])), end = ", ")
          
        # Printing the variable length Arguments
        print("args =", list(args[len(argnames):]), end = ", ")
          
        # Printing the variable length keyword
        # arguments
        print("kwargs =", kwargs, end = "")
        print(")")
          
    return inner_func
  
  
# Driver Code
@function_details
def GFG(a, b = 1, *args, **kwargs):
    pass
  
GFG(1, 2, 3, 4, 5, d = 6, g = 12.9)
GFG(1, 2, 3)
GFG(1, 2, d = 'Geeks')
Producción:

GFG (a = 1, b = 2, args = [3, 4, 5], kwargs = {'d': 6, 'g': 12.9})
GFG (a = 1, b = 2, args = [3], kwargs = {})
GFG (a = 1, b = 2, args = [], kwargs = {'d': 'Geeks'})

Publicación traducida automáticamente

Artículo escrito por nikhilaggarwal3 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *