Decoradores de pitón

Decoradores de pitón
En este artículo, vamos a discutir los decoradores de Python.

Definición: Decorator es un patrón de diseño en Python. Es una función que toma otra función como argumento, agrega alguna funcionalidad sin modificarla y devuelve otra función.

Esto se llama usando "(@)" y se coloca antes de definir una función que queremos decorar.

sintaxis:

@Decorator Nombre
Definición de función

Para comprender los decoradores, necesitamos conocer los siguientes conceptos.
Las funciones son objetos de primera clase. Significa que se puede aprobar una función como argumento, se puede devolver desde otra función, se puede asignar a una variable, se puede definir en otra función. Para una mejor comprensión, vea los siguientes ejemplos.

  1. Se puede pasar una función como argumento
    Ej: Def incremento (n):
    RETURN N + 1
    DEF demo_funcall (función):
    num = 5
    Función de retorno (NUM)
    demo_funcall (incremento)

    Aquí la función de incremento pasó como argumento

    Ejemplo 1.PY:

    Producción:

    >> Python Ejemplo1.py

  2. La función se puede devolver desde otra función
    Ej: Def Wish ():
    def say_wish ()::
    regresa "Feliz cumpleaños"
    regresar say_wish
    hola = wish ()
    Hola()

    ejemplo2.PY:

    Producción:

    >> Python Ejemplo2.py

    Aquí say_wish la función devuelta de la función de deseo

  3. La función puede modificarse y asignarse a una variable
    Ej: Def ADD (A, B):
    Devolver A +B
    sum2NOS = Agregar # Here Función Agregar asignado a la variable
    Sum2Nos (5,11)

    ejemplo3.PY:

    Producción:
    >> Python Ejemplo3.py

  4. Definir función dentro de otra función
    Ej: Def ADD (A, B):
    def sum2 (a, b):
    Devolver A + B
    res = sum2 (a, b)
    devolver Res
    Agregar (10,15)

    Ejemplo4.PY:

    Producción:
    >> Python Ejemplo4.py

Cierre:

Python permite que una función anidada acceda al alcance externo de la función de adjunto.

Saludamiento de Def (mensaje):
"Función de Closong"
Def send_greeting ()::
"Función anidada"
Imprimir (mensaje)
enviar saludo()
Saludo ("Buenos días")

ejemplo5.PY:

Producción:

>> Python Ejemplo5.py

Después de comprender los conceptos anteriores ahora, escribiremos un ejemplo de decorador.

EX1: Aquí, decoraremos la función de mensaje. Imprimir el mensaje dentro de **** Sin modificar la función original, yo.mi., función de mensaje.

#Decorator Start
Def print_msg (función):
Def WRAPPER ():
función()
Envoltura de regreso
#Decorator End
Mensaje DEF ()::
Imprimir ("Este es el primer ejemplo para demostrar decorador")
hola = print_msg (mensaje)
Hola()

ejemplo6.PY:

Producción:

>> Ejemplo de Python6.py

En la forma más simple, podemos colocar el decorador encima de la definición de la función y llamar a la función como se muestra a continuación:

Aquí cualquier cuerda que queramos decorar dentro de ***, use este decorador.

Producción:

Decorador múltiple:

Podemos tener múltiples decoradores para una sola función. Aquí el decorador se aplica en el orden que llamamos.
sintaxis:
@decorador2
@decorador1
Definición de función

Aquí se aplicará el primer decorador, luego el segundo decorador.

Pasando argumentos a las funciones del decorador:

Podemos pasar argumentos a la función de envoltorio. Los argumentos pasados ​​a la función para la que queremos decorar.

Ex:

def deco_wish (función):
Def Wrapper (Arg1, Arg2):
Imprimir ('Los argumentos aprobados son', Arg1, Arg2)
imprimir ('*********************')
función (arg1, arg2)
imprimir ('*********************')
Envoltura de regreso
@Deco_Wish
Def Wish (A1, A2):
Imprimir (A1, A2)
Deseo ('bueno', 'mañana')
Deseo ('bueno', 'tarde')

ejemplo7.PY:

Producción:

>> Python Ejemplo7.py

Pase el número variable de argumentos a la función del decorador:

Podemos aprobar cualquier número de argumentos usando *args (argumentos que no son de palabras llave como números) y ** kwargs (argumentos de palabras clave como un diccionario). Ambos son argumentos posicionales y almacenan los argumentos en las variables Args y Kwargs.

Nota: Aquí, podemos usar cualquier nombre en lugar de Args y Kwargs, pero se recomienda usar estos nombres para usar.

Ex:

Def dec_var_args (funciones):
Def wrapper (*args, ** kwargs):
Imprimir ('Los argumentos no de palabras clave son', args)
Imprimir ('Los argumentos de palabras clave son', kwargs)
función (*args)
Envoltura de regreso
@ dec_var_args
Def fun_non_key_args (*args):
Porque yo en args:
Imprimir (i)
@ dec_var_args
Def fun_key_args ()::
Imprimir ("Argumentos de palabras clave")
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'anand', lname = 'math')

ejemplo8.PY:

Producción:

>> Python Ejemplo8.py

EX2: Supongamos que tenemos 2 función
Función1: Calcule la suma de números de la lista dada
Función2: multiplique cada número por 2 y agréguelos a la lista dada de números
Si queremos calcular el tiempo tomado por cada uno para la ejecución, podemos hacerlo de 2 maneras

  1. Coloque el código entre el tiempo de inicio y el final en cada función
  2. Escribir decorador para calcular el tiempo

Consulte el siguiente código resuelto con el decorador:

#Decorator Start
exe_time_calc (func):
Def Wrapper (Arg):
start_time = dateTime.fecha y hora.ahora()
func (arg)
end_time = dateTime.fecha y hora.ahora()
Imprimir ("Toma de tiempo para ejecutar la función" + FUNC.__name__ + "is" + str (end_time - end_time))
Envoltura de regreso
#Decorator End
@exe_time_calc
def cal_avg (datos):
suma = 0
para i en datos:
suma += i
Imprimir ("El promedio de la lista de números dada es", suma // len (datos))
@exe_time_calc
def mul_by_2 (datos):
suma = 0
para i en datos:
suma + = + (i*2)
imprimir ("El suma de todos los números después de multiplicar por 2 es", suma)
cal_avg ([10,20,30,40,50])
MUL_BY_2 ([10,20,30,40,50])

ejemplo9.PY:

Producción:

>> Python Ejemplo9.py

El decorador anterior se puede usar para calcular el tiempo de ejecución para cualquiera de las funciones. Al usar un decorador, podemos evitar el código repetido cuando tenemos el requisito de calcular el tiempo de ejecución para colocar el decorador por encima de la definición de la función.

Conclusión:

Los decoradores cambian la funcionalidad de una función/método sin cambiar el código original de la función se está decorando. Usando esto, podemos evitar escribir código repetido. Conocer el concepto del decorador nos hará fuertes en Python. Podemos usar el decorador en los casos a continuación:

  • Autorización en Python Frameworks Ej: Flask y Django
  • Inicio sesión
  • Medir el tiempo de ejecución