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
Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje
with)?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--
Inicia sesión para responder este quiz y rastrear tu progreso de aprendizaje
**init** y **del****enter** y **exit**open y closestart y stop