INGENIERÍA DE SOFTWARE:



Documentos relacionados
Transcripción completa de la Lección 2 (Pinyin).

Los polinomios. Un polinomio es una expresión algebraica con una única letra, llamada variable. Ejemplo: 9x 6 3x 4 + x 6 polinomio de variable x

El olvidado mundo de las variables en PHP

La ventana de Microsoft Excel

Modulo 1 El lenguaje Java

MATERIAL 2 EXCEL 2007

HERRAMIENTAS DE ACCESS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

FORMACIÓN DE EQUIPOS DE E-LEARNING 2.0 MÓDULO DE DISEÑO Y PRODUCCIÓN DE MATERIALES UNIDAD 6 B

Estimado usuario. Tabla de Contenidos

Comercial Cartas de Fidelización

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

Ejercicio Nº 3: Realizar aumentos en una Tabla de Sueldos

Programación I: Funciones y módulos

Créditos académicos. Ignacio Vélez. Facultad de Ingeniería Industrial. Politécnico Grancolombiano

PROCESOS DE RAZONAMIENTO INVERSO: PATRÓN DE DISEÑO ADAPTER EN PYTHON Y PHP, LOS

Clases de apoyo de matemáticas Fracciones y decimales Escuela 765 Lago Puelo Provincia de Chubut

Base de datos en Excel

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

INTRODUCCIÓN A LA CONTABILIDAD DE COSTOS DEFINICIÓN

UNIVERSIDAD NACIONAL DE CÓRDOBA MANUAL DE GUARANI3W - PERFIL DOCENTE

MATEMÁTICAS Y EL ABN

Nano Taller de Python

MÉTODO DEL CAMBIO DE BASE PARA CÁLCULO MANUAL DE SUBREDES CON IP V4.0

GENERAR DOCUMENTOS HTML USANDO LENGUAJE PHP. EJERCICIO RESUELTO EJEMPLO SENCILLO. (CU00733B)

Vamos a ver las dos formas básicas de arrancar PowerPoint.

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Creación de Funciones de Conducción

Cómo instalar el software de CRM Personas en un alojamiento web remoto

INGENIERÍA DE SOFTWARE: MANIPULACIÓN DE WEB FORMS Y CARGA DE ARCHIVOS CON PYTHON Y WSGI SBRE APACHE

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

REGISTRO DE USUARIOS Y CURSOS

BANCOS. Manejo de Bancos. Como crear una ficha de Banco? Como modificar los datos de una ficha de Banco? Como borrar una ficha de Banco?

Los números racionales

El Régimen Especial del IVA en el

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

Sesión 3 - Movimiento Diferencial

Servicios de Formación:

INVENTARIO INTRODUCCIÓN RESUMEN DE PASOS

Manual de Uso Web profesional

para compras de menor cuantía La aplicación TeCuento se renueva para las compras menores

SHELL SCRIPTING: ANÁLISIS DE ARGUMENTOS

Guía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones

Módulo II - PowerPoint

PRÁCTICA 1: Optimización con Excel 2010

RESPUESTA A PREGUNTAS INFORMÁTICAS FRECUENTES.

UNIDAD DE APRENDIZAJE IV

SISTEMA DE GESTIÓN DOCUMENTAL QUIPUX MÓDULO DE TAREAS. Manual de Usuario. Septiembre Sistema de Gestión Documental Quipux

TUTORIAL SOBRE EL MANEJO DE LA OFICINA VIRTUAL PARA LA REMISIÓN DE INFORMES DE DOCENCIA VIRTUAL VÍA ADMINISTRACIÓN ELECTRÓNICA


Lección 4: Suma y resta de números racionales

Cierre y apertura en ContaPlus

MANUAL DE USUARIO DE LA HERAMIENTA CONFIGURACION DE PRESUPUESTOS PARA DISTRIBUIDORES

Marcos Cuarto estudio 4:35 al capítulo 6

Manual Básico para utilizar FET, - Mario Alberto Muñoz Zepeda - Profesor

CAPÍTULO I: UNA PRESENTACIÓN EN POCOS MINUTOS

UNIDAD 1. LOS NÚMEROS ENTEROS.

LABORATORIO Nº 3 PRÁCTICA DE FUNCIONES EN MICROSOFT EXCEL

Estampador de la industria automotriz reemplaza seis sistemas independientes con un ERP completo basado en la nube

Tema : ELECTRÓNICA DIGITAL

MANUAL DE USUARIO DEL SISTEMA PARA EL REDACTOR

Curso de PHP con MySQL Gratis

COMO HACER UN CUMENTO DE WORD PARA TRABAJOS LARES

RECUPERAR DATOS DE UN FORMULARIO HTML USANDO PHP. USO DE $_GET. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00833B)

Encuesta de Resultados de la Familia


PREPARANDO EL ENTORNO DE DESARROLLO PARA PROGRAMAR EN PHP. DESCARGAR E INSTALAR NOTEPAD++ (CU00808B)

Actividad 2.- Cuento y vídeo de Ubuntu

Manual de usuario. Tramitación de inspecciones periódicas de ascensores: La visión de los organismos de control autorizado (OCAs)

RECOMENDACIONES INICIALES

Recursos para el Estudio en Carreras de Ingeniería 2006 UNIDAD TEMÁTICA Nº 4 LA TOMA DE APUNTES

En primer lugar quiero concretar algo más ambos términos: sistemas de gestión medioambiental y empresa forestal:

EL FUTURO SERÁ UN REGALO DE DIOS (B )

SESION El comando Integrate 2. Aproximación de integrales definidas 3. Integración de funciones racionales

Interpolación polinómica

GUÍA PARA NO EXPERTOS PARA SOLICITAR E INSTALAR EL CERTIFICADO FNMT CON NESTCAPE

Antes de construir tu base de datos es conveniente saber que tipos de datos vas a almacenar y como distribuirlos.

CAPITULO DE BIENES AFECTOS O DE INVERSIÓN

TABLA DE DECISION. Consideremos la siguiente tabla, expresada en forma genérica, como ejemplo y establezcamos la manera en que debe leerse.

Artículo V522. Introducción a Google Analytics

Tutorial de Introducción a la Informática Tema 0 Windows. Windows. 1. Objetivos

Desarrollo de Aplicaciones Web Por César Bustamante Gutiérrez. Módulo I: Conceptos Básicos Tema 1: Concepto iniciales.

TUTORÍA GRUPAL ELABORACIÓN DE TRABAJOS

T.1 CONVERGENCIA Y TEOREMAS LÍMITE

Instalación del programa PSPP y obtención de una distribución de frecuencias.

Unidad 3 Direccionamiento IP (Subnetting)

1 Corinthians 10:31-32

Solo por ser auxiliar administrativo de un centro de salud del SERMAS tienes en tus manos dos herramientas muy poderosas para desobedecer;

REPORTE - Cómo superar el desamor?

Liderazgo se genera en el lenguaje

MANUAL DE USUARIO. Sistema de Administración de Proyectos de Vinculación con la Colectividad (SAPVC) MANUAL DE USUARIO DOCENTE

Plan de trabajo del tema 2

Hacer campos de solo lectura en ventanas.

5. LAS ACCIONES DE EXTENSION PROMOVIDAS POR EL ESTADO EN ESPAÑA

Dialogamos sobre la energía eléctrica que llega a nuestros hogares

LECCIÓN 4ª Operaciones Numéricas

Instalación Joomla. Instrucciones para instalar Joomla en un pc en la red local del instituto, o en un servidor en Internet

Transcripción:

30 INGENIERÍA DE SOFTWARE: WRAPPERS Y DECORADORES EN PYTHON EN EL MUNDO DE LA INGENIERÍA DE SISTEMAS, PYTHON ES UNO DE LOS LENGUAJES MÁS TEMIDOS Y RESPETADOS. EL RESPETO, NO ES ALGO QUE DEBA PERDERSE, PERO EL MIEDO, DEBERÍA SER ERRADICADO. Y ESO, ES LO QUE PRETENDO LOGRAR CON ESTA SERIE DE DOS ENTREGAS: OTORGAR UNA EXPLICACIÓN CLARA, SIMPLE Y DEFINITIVA SOBRE LOS 4 MONSTRUOS DEL LENGUAJE. EN LA ENTREGA FINAL, WRAPPERS Y DECORADORES. En la edición anterior de The Original Hacker, se hizo una explicación profunda y detallada sobre las funciones lambda y los closures dejando pendientes los wrappers y decoradores para esta entrega. Y de poner a los wrappers y decoradores en blanco sobre negro, es que nos encargaremos ahora. Antes de comenzar es necesario entender que: 1. No se puede hablar de wrappers sin haber entendido previamente qué son los closures. Por lo tanto, si no lo haz hecho aún, te recomiendo leer las páginas 5 a 8 de The Original Hacker Nº3, edición que puedes obtener en http://library.originalhacker.org/biblioteca/revista/ver/19 2. No se puede hablar de decoradores sin hablar de wrappers, puesto que básicamente ambos términos hacen referencia a lo mismo, pero con una sutil diferencia a nivel teóricoconceptual. Aclarado esto, estamos en condiciones de continuar con lo nuestro. Lo primero que debemos recordar, es que un closure es una función que dentro de ella contiene a otra función la cual es retornada cuando el closure es invocado: def closure(parametro1): def funcion(parametro2): print parametro1 + parametro2 return funcion foo = closure(10) # foo ahora es la función interna del closure print foo(200) # Imprime: 210

31 print foo(500) # Imprime: 510 No olvides repasar el artículo sobre closures publicado en The Original Hacker N3: º http://library.originalhacker.org/biblioteca/revista/ver/19 Un decorador (decorator), es aquel closure que como parámetro recibe a una función (llamada función decorada ) como único argumento: def decorador(funcion_decorada): def funcion(): return funcion Mientras que un wrapper no es más que la función interna de un closure que a la vez sea de tipo decorador (función a la que en los ejemplos anteriores llamamos funcion a secas): def decorador(funcion_decorada): La función decorada deberá ser invocada por el wrapper: def decorador(funcion_decorada): return funcion_decorada() El decorador no se invoca como una función normal. Éste es llamado con una sintaxis especial: La sintaxis anterior se debe colocar en la línea anterior a la definición de la función decorada. De esta forma, el nombre de la función decorada es pasado como parámetro de forma automática sin tener que invocar nada más:

32 print 'Soy una función decorada' Hasta aquí entonces, tenemos que: Un closure es una función que dentro de ella define otra función. Un decorador es un closure que recibe una función como parámetro. Una función decorada es la que se pasa como parámetro a un decorador. Un wrapper es la función interna del decorador, encargada de retornar a la función decorada. CÓMO FUNCIONAN Y SE ACCIONAN LOS WRAPPERS Y DECORADORES? Cuando una función es decorada, el decorador se acciona de forma automática en el momento que el script es ejecutado: #!/usr/bin/env python def decorador(funcion): print 'Soy el decorador()' print 'Soy el wrapper()' return funcion() print 'Soy la funcion_decorada()' Al ejecutar este script SIN haber invocado ninguna función, podemos ver como el decorador ya ha actuado:./foo.py Soy el decorador() Cuando la función decorada es invocada, el decorador ya la habrá reemplazado por el wrapper, retornando a éste en lugar de la función original, es decir, retorna al warpper en lugar la función decorada, tal como muestra el siguiente ejemplo: #!/usr/bin/env python

33 def decorador(funcion): print 'Soy el decorador()' print 'Soy el wrapper()' # return funcion() print 'Soy la funcion_decorada()' funcion_decorada() El resultado de la ejecución del script será el siguiente:./foo.py Soy el decorador() Soy el wrapper() Como bien puede verse, al haber invocado a funcion_decorada(), no fue ésta quien se ejecutó sino que ha sido la función wrapper(). Pero, tal y como se dijo al comienzo, el wrapper será quien tras su ejecución, invoque a la función decorada: #!/usr/bin/env python def decorador(funcion): print 'Soy el decorador()' print 'Soy el wrapper()' return funcion() print 'Soy la funcion_decorada()' funcion_decorada() El resultado ahora, será el siguiente:

34./foo.py Soy el decorador() Soy el wrapper() Soy la funcion_decorada() El orden de ejecución en wrappers y decoradores se puede establecer como el siguiente: 1. decorador (automáticamente al ejecutar el script reemplazando la función decorada por el wrapper) 2. wrapper (al invocar a la función decorada) 3. función decorada (luego de ejecutarse el wrapper) Puede decirse entonces que conceptualmente, un decorador es un closure que se encarga de reemplazar a la función decorada por su función interna, a la cuál se denomina wrapper PARA QUÉ USARÍAMOS UN WRAPPER? En primer lugar, notarás que la pregunta NO ha sido para qué usar un decorador, sino para que usar un wrapper. Esto es debido a que la respuesta a para qué utilizar un decorador es fácilmente deducible: para implementar un wrapper. Los wrappers o envolturas, suelen utilizarse cuando se tienen funciones que ANTES de ejecutar su verdadera funcionalidad, realizan acciones redundantes. Un ejemplo muy típico, es cuando se utilizan bloques try y def get_template(): with open('template.html', 'r') as archivo: return archivo.read() return 'ERROR INTERNO' def calcular(partes=0, total=100): return total / partes return 'ERROR INTERNO' Como podemos ver, tenemos dos funciones que utilizan bloques try y except (generalmente, se tienen muchísimas más). Una forma de manejar los errores en estas funciones, sería utilizar un wrapper: def intentar(funcion):

35 # Usamos *args y **kwargs ya que tenemos una función que necesita argumentos def wrapper(*args, **kwargs): return funcion(*args, **kwargs) return 'ERROR INTERNO' De esta forma, solo deberíamos decorar a las funciones que anteriormente utilizaban los bloques try y @intentar def get_template(): with open('template.html', 'r') as archivo: return archivo.read() @intentar def calcular(partes=0, total=100): return total / partes Si invocáramos a calcular con los argumentos por defecto, se produciría un error al intentar dividir por cero, pero sería manejado por el wrapper:./bar.py ERROR INTERNO Frecuentemente, lo mismo que sucede con el manejo de errores en cuanto a acciones repetidas en distintas funciones, suele darse con acciones como el control de acceso (usado por ejemplo, para verificar si un usuario tiene permisos suficientes antes de efectuar una determinada acción) o el registro de actividades (conocido como logging). Un uso menos frecuente aunque paradójicamente podríamos mencionarlo como imprescindible, es para el control de datos mediante filtros de saneamiento o de tratamiento, como se muestra en el siguiente ejemplo Web para Python sobre Apache con WSGI: def get_post_data(funcion): def wrapper(environ): _POST = {} # decorador # claramente este es el wrapper del decorador datos = environ['wsgi.input'].read().split('&') for par in datos: key, value = par.split('=')

36 _POST[key] = unquote(value).replace('+', ' ') key, value = (None, None) return funcion(_post) # retorna a la función decorada una vez termina lo anterior @get_post_data # llamada al decorador def guardar(post): # función decorada nombre = POST['nombre'] apellido = POST['apellido'] #... @get_post_data def actualizar(post): # llamada al decorador # función decorada @get_post_data def eliminar(post): # llamada al decorador # función decorada Como puede verse en el ejemplo anterior, la llamada al decorador es una sintaxis abreviada equivalente a: get_post_data(guardar) def guardar(post): nombre = POST['nombre'] apellido = POST['apellido'] #... get_post_data(actualizar) def actualizar(post): get_post_data(eliminar) def eliminar(post): Sin embargo, la nueva sintaxis propuesta por la incorporación de decoradores, hace la lectura del código fuente mucho más simple.