Claúsula "With" - Python 2.5
Submitted by flaper87 on Sat, 06/02/2007 - 02:48.
En la última versión de python (la 2.5), han habido muchas variaciones en cosas que ya existían como la forma de usar generadores, la validación de funciones, nuevas modalidades para las estructuras de decisión, como a su ves han habido nuevas funciones que han sido agregadas a este lenguaje. Una de ellas es la clausula "with", la cual tiene una forma simple y cómoda de funcionar.Supongamos que en alguna ocasión, necesitamos utilizar alguna información que tenemos en un fichero, lo que normalmente haríamos seria abrir el fichero, operarlo y luego cerrarlo, con la sentencia "with" simplemente lo tomamos, lo usamos y lo liberamos. Este tipo de casos los encontramos no solo en la manipulación de ficheros, también en conexiones con bases de datos, manipulacion de clases, librerias, entre otros. Vamos a la practica.
La forma para importar esta Clausula es la siguiente:
>>> from __future__ import with_statement
Esta clausula se encuentra en el modulo future, ya que algunas de las novedades de python2.5 están aun en prueba y no se han liberado.
Ahora si, un ejemplo de uso de esta clausula:
>>> from __future__ import with_statement
>>> with open('hola','r') as file:
... contenido = (file.read()).split()
...
>>> print contenido
['hola']
>>>
Este ejemplo anterior se adapta muy bien para aquellos que suelen abrir los archivos, volcar su contenido dentro de una lista y manipularlos desde ahí, como en mi caso :).
Ahora bien, pasemos a un ejemplo un poco mas complejo, sabemos que con el "with" podemos capturar *algo* (termino que uso para generalizar) que necesitemos y tomar de el sus funciones, contenidos, clases etc, entonces hagamos una prueba con una clase.
Tenemos una clase llamada prueba, en la cual tenemos definidas 4 funciones, observen:
>>> from __future__ import with_statement
>>> valor = 3
>>> class prueba(object):
... def __init__(self,valor):
... self.valor = valor
... def __enter__ (self):
... self.valor += self.valor
... self.mostrar = "El valor es: " + str(self.valor)
... return self
... def __exit__(self,type,value,traceback):
... if traceback is not None:
... print "Hubo Problemas"
... def imprimir(self):
... print self.mostrar
...
>>> with prueba(valor) as imp:
... imp.imprimir()
...
El valor es: 6
>>>
En nuestra clase prueba tenemos definida primero que nada una función __init__ que es la que va a recoger los valores o atributos que se le indiquen a la clase prueba. Seguida a esta función tenemos el metodo __enter__ que en nuestro caso nos retorna los valores recogidos por el __init__ y que fueron procesados en __enter__, es decir, retorna tanto el self.valor como el self.mostrar dentro de un *campo global* (por asi llamarlo) self. Luego de esto tenemos el metodo __exit__ que seria la salida de la clausula with, en nuestro caso, simplemente comprueba si el traceback tiene una salida distinta a None para que nos diga si algo ha salido mal.
Por último tenemos la función imprimir la cual va a mostrarnos el valor calculado en el metodo __enter__
Realmente, el ejemplo que muestro puede ser realizado de una manera mas simple y sin usar el with, pero la idea del mismo es mostrar el funcionamiento de esta clausula y que si vemos mas profundamente en ella, podremos ver que trae facilidades para procesos comunes como conexiones a bases de datos, o funciones y clases mas complicadas que pueden ser encontradas o necesitadas en algun momento.
Espero haberme explicado bien, y que hayan entendido esta clausula.
Saludos!!

Post new comment