Pitón

Decoradores de Python

Decoradores de Python
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, le agrega alguna funcionalidad sin modificarla y devuelve otra función.

Esto se llama usar “(@)” y se coloca antes de definir una función que queremos decorar.

sintaxis:

@ nombre del decorador
Definición de función

Para comprender a los decoradores, necesitamos conocer los siguientes conceptos.
Las funciones son objetos de primera clase. Significa que una función se puede pasar 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, consulte los ejemplos a continuación.

  1. Una función se puede pasar como argumento
    Ex:

    def incremento (n):
    devuelve n + 1
    def demo_funcall (función):
    num = 5
    función de retorno (num)
    demo_funcall (incremento)

    Aquí la función de incremento se pasa como argumento

    Ejemplo 1.py:

    Producción:

    >> Python ejemplo1.py

  2. La función se puede devolver desde otra función
    Ex:

    def deseo ():
    def say_wish ():
    volver "Feliz cumpleaños"
    volver say_wish
    hola = deseo ()
    Hola()

    ejemplo2.py:

    Producción:

    >> Python ejemplo2.py

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

  3. La función se puede modificar y asignar a una variable
    Ex:

    def agregar (a, b):
    devolver a + b
    sum2nos = agregar # Aquí la función agregar asignada a la variable
    sum2nos (5,11)

    ejemplo3.py:

    Producción:
    >> Python example3.py

  4. Definir función dentro de otra función
    Ex:

    def agregar (a, b):
    def suma2 (a, b):
    devolver a + b
    res = suma2 (a, b)
    volver res
    añadir (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 adjunta.

def saludo (mensaje):
"Función adjunta"
def enviar_saludo ():
"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.

Ej1: Aquí decoraremos la función de mensaje. Imprimiendo el mensaje dentro de **** sin modificar la función original, i.mi., función de mensaje.

#decorator start
def print_msg (función):
def envoltorio ():
función()
envoltorio de devolución
#decorator end
def mensaje ():
imprimir ("Este es el primer ejemplo de demostración de decorador")
hola = print_msg (mensaje)
Hola()

ejemplo6.py:

Producción:

>> Python example6.py

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

Aquí cualquier hilo que queramos decorar dentro ***, usa 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 contenedora. Los argumentos pasados ​​a la función para la que queremos decorar.

Ex:

def deco_wish (función):
def envoltorio (arg1, arg2):
print ('Los argumentos pasados ​​son', arg1, arg2)
impresión ('*********************')
función (arg1, arg2)
impresión ('*********************')
envoltorio de devolución
@deco_wish
def deseo (a1, a2):
imprimir (a1, a2)
deseo ('Buenos', 'Buenos días')
deseo ('Bien', 'Tarde')

ejemplo7.py:

Producción:

>> Python example7.py

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

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

Nota: Aquí, podemos usar cualquier nombre en lugar de args y kwargs, pero se recomienda usar estos nombres.

Ex:

def dec_var_args (función):
def envoltorio (* argumentos, ** kwargs):
print ('Los argumentos que no son palabras clave son', args)
print ('Los argumentos de la palabra clave son', kwargs)
función (* args)
envoltorio de devolución
@ dec_var_args
def fun_non_key_args (* argumentos):
porque yo en argumentos:
imprimir (i)
@ dec_var_args
def fun_key_args ():
print ("Argumentos de palabras clave")
fun_non_key_args ((4,5,6))
fun_key_args (fname = 'Anand', lname = 'Math')

ejemplo8.py:

Producción:

>> Python example8.py

Ej2: Supongamos que tenemos 2 funciones
Función1: calcula la suma de números de la lista dada
Función2: multiplica cada número por 2 y agrégalos a la lista de números dada
Si queremos calcular el tiempo que tarda cada uno en ejecutarse, podemos hacerlo de 2 formas

  1. Coloque el código entre la hora de inicio y finalización en cada función
  2. Decorador de escritura para calcular el tiempo

Vea el código a continuación resuelto con el decorador:

#decorator start
exe_time_calc (func):
def envoltorio (arg):
start_time = fecha y hora.fecha y hora.ahora()
func (arg)
end_time = fecha y hora.fecha y hora.ahora()
print ("El tiempo necesario para ejecutar la función" + func.__name__ + "es" + str (end_time - end_time))
envoltorio de devolución
#decorator end
@exe_time_calc
def cal_avg (datos):
suma = 0
para i en datos:
suma + = yo
print ("El promedio de una lista de números dada es", sum // len (datos))
@exe_time_calc
def mul_by_2 (datos):
suma = 0
para i en datos:
suma + = + (i * 2)
print ("La 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 example9.py

El decorador anterior se puede utilizar para calcular el tiempo de ejecución de cualquiera de las funciones. Al usar un decorador, podemos evitar el código repetido cuando tenemos un requisito para 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 que se está decorando. Usando esto, podemos evitar escribir código repetido. Conocer el concepto de decorador nos hará fuertes en Python. Podemos usar decorador en los siguientes casos:

Cómo cambiar la configuración del mouse y el panel táctil con Xinput en Linux
La mayoría de las distribuciones de Linux se envían con la biblioteca "libinput" de forma predeterminada para manejar eventos de entrada en un sistema...
Vuelva a asignar los botones del mouse de manera diferente para diferentes programas con X-Mouse Button Control
Tal vez necesite una herramienta que pueda hacer que el control de su mouse cambie con cada aplicación que use. Si este es el caso, puede probar una a...
Revisión del mouse inalámbrico Microsoft Sculpt Touch
Recientemente leí sobre el Microsoft Sculpt Touch mouse inalámbrico y decidí comprarlo. Después de usarlo por un tiempo, decidí compartir mi experienc...