Ir al contenido principal

"Decoradores" con python.

Hola, mi nombre es Antonio Alfonso Martínez y en el presente articulo nos proponemos a dar unas breves pinceladas acerca del uso de decoradores en python.

Para empezar diremos que los “decoradores” son funciones, las cuales, toman como argumento otra función como argumento para acabar generando una tercera función (la cual incorporará las funciones de la función decorada). Se trata de un método que nos permitirá ampliar las funcionalidades de una función definida, en determinadas circunstancias. Lo dicho también podría aplicarse a las clases, aunque a la aplicación de decoradores a clases, dedicaremos otro artículo en el futuro.

En nuestra explicación partiremos de una sencilla función (a la que llamaremos “hola”) cuyo único cometido será mostrar en pantalla el mensaje “¡HOLA!”:

sin_decorar
Como se puede apreciar, hemos creado una función muy sencilla. Acto seguido, vamos a “decorar” nuestra función, haciendo uso de otra función, decoradora a la que daremos el nombre de “decoraror”:

decorador2

Así hemos creado nuestro decorador, el cual tomará como argumento (“funci”) la función a decorar (que en nuestro ejemplo es la ya referida “hola()”) para retornar una nueva función (llamada “saludo”) que definimos dentro del decorador y que, a la ejecución de la función original (“hola”), añadirá un texto antes y después de la ejecución de la función a decorar.

Una vez creado nuestro decorador, lo que haremos será aplicarlo a la función que queremos decorar (función “hola” en nuestro ejemplo). Para ello lo que haremos será introducir el símbolo “@” seguido del nombre de la función que vamos a emplear como decorador (a la que dimos el nombre de “decorador” en nuestro ejemplo) para, en las líneas siguientes, definir la función que queremos decorar, tal y como se puede apreciar en la imagen siguiente:

decorador3

Así, el empleo de “@” seguido del nombre del decorador aplicado sobre la función “hola” vendría a equivaler a “hola=decorador(hola)”.

Con ello nuestra función “decorador” tomará como argumento la función “hola” para retornar la función “saludo” la cual añadirá los textos “Python te saluda” y “Tenga un buen día” antes y después de la ejecución de la función “hola”:

decorador1

Así, tal y como se aprecia en la imagen, hemos “decorado” nuestra función original para que incorpore un texto antes y después de la visualización del saludo original.

Hasta ahora hemos procedido a la “decoración” de una función sin argumentos. De modo que si quisiéramos aplicar el decorador que hemos creado a una función con argumentos, tal acción no podría llevarse a cabo (dando lugar a un error).

Es por ello que lo que vamos a hacer a continuación es modificar nuestro decorador de tal forma que pueda aplicarse sobre funciones que reciban argumentos. Para este nuevo ejemplo partiremos de una nueva función a decorar que llevará el nombre de “división”:

sin decorador2

Acto seguido vamos a crear el correspondiente decorador de modo que pueda recibir como argumento nuestra función “division”. Para ello escribiremos lo siguiente:

funci1

Como se puede apreciar, hemos dado a nuestro decorador una estructura muy similar a la que veíamos para el caso anterior, con la salvedad que la función que va a retornar (“div_text” en este caso) recibe como argumentos, los propios de la función original, introduciendo por convención “*args” y “**kwargs” para poder introducir en la nueva función los argumentos y variables que deseemos introducir. A su vez,  crearemos la variable “resultado” que será igual a la aplicación de la función “division” sobre los valores que definiremos más adelante (dicha aplicación se producirá en la ejecución de la nueva función “div_text” que es la que finalmente retornará nuestro decorador).

funci2

Una vez creado el decorador, lo aplicamos (tal y como veíamos con anterioridad) sobre la función decorada (función “division” en este caso) la cual recibe como argumentos las variables “num” y “num2”, tal y como se aprecia en la  imagen de arriba. Acto seguido visualizaremos el resultado dando a las variables “num” y “num2” los valores 12 y 7 respectivamente:

funci

Ejecutamos el programa y obtenemos el siguiente resultado:
resultado

Como se aprecia, junto al “imput” original de nuestra función decorada “division” (consistente en la división de los valores introducidos para “num” y “num2”) se han añadido los textos aportados por la nueva función retornada por el decorador.

Pero además de la visualización de textos, podemos añadir a nuestra función originaria más y distintas funcionalidades, así, por ejemplo si quisiéramos que en un determinado caso,  se mostrara, junto al resultado de la división, el tiempo en segundos que ha tardado en efectuarse:

funci_time

Como se ve, para este caso, hemos  hecho uso del módulo “time”, para luego, mediante las variables “t1” y “t2” efectuar el cálculo del tiempo, en segundos, empleado en la ejecución de la función, obteniendo el siguiente resultado:

funciresultime

De ese modo hemos logrado añadir a la función original, la funcionalidad de mostrar el tiempo en segundos (cuyo valor es, naturalmente 0.0).

Este último ejemplo lo podeis ver en el siguiente enlace a Github:
https://github.com/antonioam82/ejercicios-python/blob/master/funci.py

Saludos.

Comentarios

  1. This is a really informative knowledge, Thanks for posting this informative Information. Cloud Computing

    ResponderBorrar

Publicar un comentario

Entradas más populares de este blog

Descargar vídeos y audios de YouTube con Python y Pafy

Introducción: YouTube es una plataforma que nos permite disfrutar de vídeos informativos, películas, música y mucho, mucho más. Siempre que escuchamos una canción queremos descargarla, si vemos un vídeo también queremos descargarlo, de esta manera podríamos verlos desde donde queramos sin necesidad de una conexión a Internet. Hoy te enseñare a descargar vídeos y audios de el sitio web conocido como YoutTube, esto lo lograremos haciendo uso de una librería llamada Pafy, si aun no tienes la librería Pafy, puedes descargarla ingresando al siguiente enlace:  Librería Pafy . Usando Pafy: Pafy una biblioteca de Python para descargar contenido de YouTube y recuperar metadatos. Antes de descargar contenido, usaremos a Pafy para obtener información de un vídeo especifico. A continuación te mostrare un ejemplo para obtener el titulo de un vídeo. import pafy url_video = " https://www.youtube.com/watch?v=JkK8g6FMEXE " video = pafy.new(url_video) pr

Calculando el factorial de un número (ejemplo de función recursiva).

Hola, mi nombre es Antonio Alfonso Martínez y en el presente artículo me dispongo a explicar un sencillo método para calcular el factorial de un número haciendo uso del concepto de recursividad. Para empezar, diremos que el factorial de un número natural "n" es el resultado del producto de todos los números desde 1 hasta dicho número "n". Así, para efectuar el calculo del factorial de un número, vamos a emplear una sencilla función a la que daremos el nombre de "factorial". De modo, que, partiendo del hecho de que el factorial de 1 y 0 es 1, construiremos nuestra función (a la que daremos el nombre de "factorial") para realizar el calculo del factorial de 5: Lo que hace esta función, es tomar como argumento un número "n". de modo que si este es 0 o 1 ("if n==0 or n==1:") la función devolverá directamente como resultado el número 1 ("resultado=1"). Sin embargo si dicho número "n" es mayor que

Sistema Hexadecimal - Sistema de numeración posicional

Sistema Hexadecimal El sistema hexadecimal es un sistema numérico que tiene como base el numero 16, y es una variante de los numero binarios El sistema hexadecimal es utilizado por nuestros ordenadores con el fin de abreviar valores de datos e instrucciones de memoria. Esta es una imagen que muestra el contenido de un archivo con exención 'dll' en un editor de texto, como el editor de texto no reconoce este tipo de archivo, nos lo muestra de esta manera: Como se puede apreciar, en vez de ver una gran cantidad de 0 y 1, vemos que hay grupos de 4 dígitos, y si observamos, vemos que son grupos de dígitos hexadecimales. El archivo cuentan con más de 48 mil lineas, por ello no se me es posible mostrarlo todo. Este es uno de los usos del sistema hexadecimal para abreviar grandes cantidades de 0 y 1. Ustedes mismos pueden hacer la prueba con una imagen o con cualquier otro tipo de texto. El sistema hexadecima, esta conformado por solo 16 dígitos. A continuación te los