Gestión de Contextos en Python: Clases y Generadores
Los context managers son objetos de Python que proveen información contextual adicional al bloque de código. Esta información consiste en correr una función (o cualquier callable) cuando se inicia el contexto con el keyword with; al igual que correr otra función cuando el código dentro del bloque with concluye. Por ejemplo:
Si estás familiarizado con este patrón, sabes que llamar la función open de esta manera, garantiza que el archivo se cierre con posterioridad. Esto disminuye la cantidad de información que el programador debe manejar directamente y facilita la lectura del código.
Existen dos formas de implementar un context manager: con una clase o con un generador. Vamos a implementar la funcionalidad anterior para ilustrar el punto:
Esta es simplemente una clase de Python con dos métodos adicionales: enter y exit. Estos métodos son utilizados por el keyword with para determinar las acciones de inicialización, entrada y salida del contexto.
El mismo código puede implementarse utilizando el módulo contextlib que forma parte de la librería estándar de Python.
from contextlib import contextmanager
@contextmanager
def custom_open(filename): f =open(filename)try:yield f
finally: f.close()withcustom_open('file')asf: contents = f.read()
El código anterior funciona exactamente igual que cuando lo escribimos con una clase. La diferencia es que el código se ejecuta al inicializarse el contexto y retorna el control cuando el keyword yield regresa un valor. Una vez que termina el bloque with, el context manager toma de nueva cuenta el control y ejecuta el código de limpieza.
Otro gran ejemplo de context managers (sin caer en el razonamiento circular usando "open" para crean un "custom_open")
es el verlo como una implementacion de tareas de shell, pero en python (imaginate escribiendo el "setup.py" de un server linux)
Han notado como es muy sencillo escribir en shell:
cd /path/to/project
coolShellCommand -xyz
cd -
Pero en python se necesita implementar algo como esto:
Esto hace lo mismo que al principio, nos evitamos duplicar codigo y aprendemos sobre conext managers
Excelente aporte.
Gracias!
Python esta lleno de trucos que casi parecen mágia.
A veces así parece
Hola estimado David (@jdaroesti), me encanta la forma en la que explicas y enseñas, desde el curso pasado soy tu fan.
Sin embargo encontré en el presente artículo algo que podría mejorar:
En el primer ejemplo sobre el uso de with pegaste with con open, lo que ocasionará en la práctica un error de sintaxis.
Ojalá no me vea muy chocoso con éste comentario, pero siento que tu calidad como profesional de python, es muy alta y éste pequeño error podría quitar coherencia a tu imagen.
Excelente curso, ojalá fueras mentor de otros cursos de programación como javascript.
Saludos.
Como que le quedó igual el código estimado colega. Al parecer es problema del editor de platzi.
El editor tiende a pegar las palabras, si le das copy - paste debes desagruparlas.
creo que comprendi, tengo que practicarlo mas
Si te ayuda, el libro de Python tiene ejemplos que me parecen más claros en español.
me gustó mucho esta información... de hecho siento que por fin voy entendiendo como funciona el lenguaje por dentro... animo a todos a seguir aprendiendo :D
Está genial ir aprendiendo esto que nos hace entender mejor como funciona todo :D
En palabras para mortales, los contextos son una función decoradora que ayuda a ejecutar código antes y después de código que les pasemos.
Hola Cesar!
Gracias por tu aporte. En mi caso entiendo que una funcion decoradora en esencia expande el comportamiento de alguna otra función. Quisiera entender si en el caso del context manager, este es una funcion decoradora de la funcion que vaya justo despues del keyword with.
Saludos!
En otras palabras, el protocolo de gestor de contextos definidos en el PEP 343 permite la extracción de la parte aburrida de la estructura try..except..finally en una clase separada manteniendo solo el bloque de interés do_something.
Primero se llama al método enter. Puede devolver un valor que será asignado a var. La parte as es opcional: si no está presente, el valor devuelto por enter será ignorado.
El bloque de código bajo with se ejecutará. Como si fueran condiciones try. Se podrá ejecutar con éxito hasta el final o, si algo falla, puede break, continue` o return o lanzar una excepción. Pase lo que pase, una vez que el bloque ha finalizado, se producirá una llamada al método exit. Si se lanzó una excepción, la información se manda a exit, el cual se describe en la siguiente subsección. En el caso normal, las excepciones podrían ser ignoradas como si fueran una condición finally y serían relanzadas después de que finalice exit.
Genial explicación.
Excelente ejemplo
Esta clase me voló la cabeza. Ahora entiendo cómo funciona el with perfectamente.
Excelente info
En que otros ambitos o casos podemos usar el context manager
Despues de un año, hoy use el context manager y me sirvio para poder extender una clase de una libreria y poder añadirle mis propias funcionalidades !
Genial, excelente información.
Los métodos init, enter y exit los entendí como los React lifecycles jajaa
Las 2 ultimas clases del módulo muy vagas en información pero son conceptos de python muy interesantes y geniales. Gracias a la comunidad por los recursos adicionales 🤠
se explica en algún momento de este curso o del curso de python el uso de yield?