Los decoradores son una herramienta muy poderosa y útil en Python, ya que permite a los programadores modificar el comportamiento de una función o clase. Los decoradores nos permiten envolver otra función para extender el comportamiento de la función envuelta, sin modificarla permanentemente.
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
Decorador de despacho
Se utiliza un decorador de Dispatch para seleccionar entre diferentes implementaciones del mismo método abstracto en función de la firma o lista de tipos.
Ejemplo:
# Python program to demonstrate # dispatch decorator from multipledispatch import dispatch @dispatch(int) def func(x): return x * 2 @dispatch(float) def func(x): return x / 2 # Driver code print(func(2)) print(func(2.0))
Producción:
4 1.0
En el ejemplo anterior, la @dispatch(int)
declaración sugiere que Dispatcher ‘func’ se crea y luego asigna el tipo ‘int’ como clave y dispatcher ‘func’ como valor y lo asigna al i-ésimo índice en el espacio de nombres (diccionario).
Ahora todos deben preguntarse qué es un espacio de nombres. No se preocupe, echemos un vistazo al espacio de nombres.
espacio de nombres
Un espacio de nombres no es más que un diccionario que utiliza el decorador de envíos. El decorador de despacho crea un objeto de despacho con el nombre de la función y almacena este objeto como un par clave-valor. Este diccionario se usa para asignar funciones como func
en el ejemplo anterior a un objeto despachador como Disptacher('func')
.
De forma predeterminada, el espacio de nombres utilizado es el espacio de nombres global en multipledispatch.core.global_namespace
. Para mayor seguridad, uno puede establecer sus propios espacios de nombres usando un diccionario.
Ejemplo:
from multipledispatch import dispatch nsp = {} @dispatch(int, namespace = nsp) def func(x): return x * 2 @dispatch(float, namespace = nsp) def func(x): return x / 2 # Driver code print(func(2)) print(func(2.0)) print(nsp)
Producción:
4 1.0 {'func': <dispatched func>}
Publicación traducida automáticamente
Artículo escrito por riasehgal1999 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA