Administrador de Contexto de Python

Aunque los administradores de contexto de Python se utilizan ampliamente, pocos comprenden el propósito detrás de su uso. Estas sentencias, comúnmente utilizadas con la lectura y escritura de archivos, ayudan a la aplicación a conservar la memoria del sistema y mejoran la gestión de recursos asegurando que ciertos recursos solo estén en uso para procesos específicos.

La sentencia with

Un administrador de contexto es un objeto al que se le notifica cuándo comienza y termina un contexto (un bloque de código). Comúnmente se utiliza uno con la sentencia with. Este se encarga de la notificación.

Por ejemplo, los objetos de archivo son administradores de contexto. Cuando un contexto termina, el objeto de archivo se cierra automáticamente:

# Administrador de contexto: maneja automáticamente la limpieza de recursos
# El archivo se cierra automáticamente al salir del bloque 'with'
with open(filename) as f:  # 'f' es el objeto de archivo
    file_contents = f.read()

# El archivo se cierra automáticamente aquí, incluso si ocurrió un error
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Cuál es el principal beneficio de usar un administrador de contexto (la sentencia with)?
A. Maneja automáticamente la limpieza de recursos, incluso si ocurre un error
B. Hace que el código se ejecute más rápido
C. Permite abrir múltiples archivos simultáneamente
D. Previene todos los errores

Cualquier cosa que finalice la ejecución del bloque provoca que se llame al método de salida del administrador de contexto. Esto incluye excepciones, y puede ser útil cuando un error provoca que salga prematuramente de un archivo o conexión abierta. Salir de un script sin cerrar correctamente los archivos/conexiones es una mala idea, lo que puede causar pérdida de datos u otros problemas. Al usar un administrador de contexto, puede asegurarse de que siempre se tomen precauciones para prevenir daños o pérdidas de esta manera.

Escribir su propio administrador de contexto

También es posible escribir un administrador de contexto usando sintaxis de generador gracias al decorador contextlib.contextmanager:

# Administrador de contexto basado en función usando el decorador contextlib
import contextlib
@contextlib.contextmanager
def context_manager(num):
    print('Enter')  # El código antes de yield se ejecuta en __enter__
    yield num + 1   # El valor cedido se convierte en la variable 'cm'
    print('Exit')    # El código después de yield se ejecuta en __exit__

with context_manager(2) as cm:  # cm recibe el valor cedido (3)
    print('Right in the middle with cm = {}'.format(cm))
Enter
Right in the middle with cm = 3
Exit

Administrador de contexto basado en clases

Puede definir un administrador de contexto basado en clases. Los métodos clave son __enter__ y __exit__

# Administrador de contexto basado en clases: implementa los métodos __enter__ y __exit__
class ContextManager:
    def __enter__(self, *args, **kwargs):  # Se llama al entrar en el bloque 'with'
        print("--enter--")
        return self  # Puede devolver un objeto para usar como variable 'as'

    def __exit__(self, *args):  # Se llama al salir del bloque 'with'
        print("--exit--")

with ContextManager():  # Llama a __enter__, luego a __exit__ cuando termina
    print("test")
--enter--
test
--exit--
Quiz

Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje

¿Qué métodos debe implementar una clase para ser utilizada como administrador de contexto?
A. **init** y **del**
B. **enter** y **exit**
C. open y close
D. start y stop

Enlaces relevantes