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()
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_varnames
atributo que devuelve la tupla de nombres de argumentos y variables locales y co_argcount
que 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')
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