Python

Python

Tutorial Python: Contexto with

Aprende a usar gestores de contexto with en Python para manejar recursos de forma segura y eficiente. Mejora tu código con ejemplos y buenas prácticas.

Aprende Python y certifícate

Gestores de contexto

Los gestores de contexto son una característica elegante de Python que facilita la administración eficiente de recursos como archivos, conexiones de red o bases de datos. Funcionan como asistentes invisibles que se encargan de preparar un recurso para su uso y, lo más importante, de limpiarlo adecuadamente cuando ya no lo necesitamos.

¿Qué son los gestores de contexto?

En programación, es común encontrarnos con recursos que requieren una inicialización antes de usarlos y una liberación después de terminar. Pensemos en un archivo: necesitamos abrirlo antes de leer o escribir en él, y cerrarlo cuando terminamos para liberar el recurso del sistema operativo.

# Sin gestor de contexto
archivo = open('datos.txt', 'r')
contenido = archivo.read()
archivo.close()  # Si olvidamos esta línea, el archivo queda abierto

Los gestores de contexto automatizan este proceso mediante un protocolo que define qué debe ocurrir al entrar y salir de un bloque de código específico.

Cómo funcionan internamente

Un gestor de contexto implementa dos métodos especiales:

  • __enter__(): Se ejecuta al iniciar el bloque with y prepara el recurso
  • __exit__(): Se ejecuta automáticamente al finalizar el bloque with y libera el recurso

Cuando usamos un objeto como gestor de contexto, Python se asegura de que estos métodos se llamen en el momento adecuado, incluso si ocurren excepciones dentro del bloque.

Gestores de contexto comunes

El gestor de contexto más utilizado en Python es el que maneja archivos:

# Con gestor de contexto para archivos
with open('datos.txt', 'r') as archivo:
    contenido = archivo.read()
    # No necesitamos cerrar el archivo manualmente
# Al salir del bloque with, el archivo se cierra automáticamente

Otros gestores de contexto comunes incluyen:

  • Conexiones a bases de datos: Aseguran que las transacciones se completen correctamente y las conexiones se cierren
with conexion.cursor() as cursor:
    cursor.execute("SELECT * FROM usuarios")
    resultados = cursor.fetchall()
# La conexión se cierra automáticamente
  • Bloqueos y semáforos: Para programación concurrente
with threading.Lock():
    # Código que requiere acceso exclusivo a un recurso compartido
# El bloqueo se libera automáticamente
  • Redirección temporal de salida: Para capturar o redirigir la salida estándar
from contextlib import redirect_stdout
import io

f = io.StringIO()
with redirect_stdout(f):
    print("Este texto se captura en la variable f")
resultado = f.getvalue()

Beneficios de los gestores de contexto

Los gestores de contexto ofrecen varias ventajas importantes:

  1. Código más limpio: Eliminan la necesidad de escribir código repetitivo para inicializar y liberar recursos.

  2. Manejo de errores robusto: Garantizan la liberación de recursos incluso cuando ocurren excepciones.

  3. Prevención de fugas de recursos: Evitan problemas comunes como archivos abiertos o conexiones de red que no se cierran.

  4. Localización del código: Agrupan visualmente el código que utiliza un recurso específico.

Ejemplos prácticos

Un caso de uso común es la medición de tiempo de ejecución:

import time
from contextlib import contextmanager

@contextmanager
def medir_tiempo():
    inicio = time.time()
    try:
        yield  # Aquí se ejecutará el código dentro del bloque with
    finally:
        fin = time.time()
        print(f"Tiempo de ejecución: {fin - inicio:.4f} segundos")

# Uso del gestor de contexto
with medir_tiempo():
    # Código cuyo tiempo queremos medir
    resultado = sum(range(10000000))

Otro ejemplo útil es la gestión de cambios temporales en configuraciones:

@contextmanager
def cambio_temporal_directorio(nuevo_dir):
    directorio_original = os.getcwd()
    try:
        os.chdir(nuevo_dir)
        yield
    finally:
        os.chdir(directorio_original)

# Uso
with cambio_temporal_directorio('/tmp'):
    # Operaciones en el directorio temporal
    with open('archivo_temporal.txt', 'w') as f:
        f.write('datos temporales')
# Volvemos automáticamente al directorio original

Gestores de contexto anidados

Una característica poderosa es la capacidad de anidar varios gestores de contexto:

with open('entrada.txt', 'r') as archivo_entrada, open('salida.txt', 'w') as archivo_salida:
    for linea in archivo_entrada:
        archivo_salida.write(linea.upper())
# Ambos archivos se cierran automáticamente

Este patrón es especialmente útil cuando necesitamos coordinar múltiples recursos que deben liberarse en un orden específico.

Cuándo usar gestores de contexto

Los gestores de contexto son ideales para:

  • Recursos que necesitan ser liberados (archivos, conexiones, bloqueos)
  • Operaciones que requieren configuración y limpieza
  • Código que debe ejecutarse en un entorno controlado temporalmente

En general, siempre que te encuentres escribiendo código con un patrón de "preparar-usar-limpiar", considera usar un gestor de contexto para hacerlo más elegante y seguro.

Sintaxis y uso del bloque with

La sentencia with en Python proporciona una sintaxis elegante y concisa para trabajar con gestores de contexto. Esta construcción simplifica el código al encapsular los patrones comunes de configuración y limpieza de recursos en un bloque bien definido.

Estructura básica

La sintaxis fundamental del bloque with sigue este patrón:

with expresion_contexto [as variable]:
    # Bloque de código que utiliza el recurso

Donde:

  • expresion_contexto es cualquier expresión que devuelve un objeto gestor de contexto
  • La parte as variable es opcional y asigna el valor devuelto por el método __enter__() a la variable especificada
  • El bloque indentado contiene el código que trabaja con el recurso gestionado

Uso con archivos

El ejemplo más común de uso del bloque with es para el manejo de archivos:

with open('ejemplo.txt', 'r') as archivo:
    contenido = archivo.read()
    print(contenido)
# El archivo se cierra automáticamente al salir del bloque

Este código es equivalente a:

archivo = open('ejemplo.txt', 'r')
try:
    contenido = archivo.read()
    print(contenido)
finally:
    archivo.close()

La versión con with es más concisa y menos propensa a errores, ya que no es posible olvidar cerrar el archivo.

Múltiples gestores de contexto

Python permite utilizar múltiples gestores de contexto en una sola sentencia with de dos formas:

1. Usando comas para separar los gestores:

with open('entrada.txt', 'r') as entrada, open('salida.txt', 'w') as salida:
    for linea in entrada:
        salida.write(linea.upper())

2. Anidando bloques with:

with open('entrada.txt', 'r') as entrada:
    with open('salida.txt', 'w') as salida:
        for linea in entrada:
            salida.write(linea.upper())

La primera forma es más compacta y generalmente preferida en código moderno de Python.

Captura de valores de retorno

El valor devuelto por el método __enter__() del gestor de contexto se asigna a la variable después de as:

with open('datos.csv', 'r') as archivo:
    # archivo contiene el objeto file devuelto por open.__enter__()
    primera_linea = archivo.readline()

En algunos gestores de contexto, este valor de retorno puede ser diferente del propio gestor:

import sqlite3

with sqlite3.connect('base_datos.db') as conexion:
    with conexion.cursor() as cursor:
        cursor.execute("SELECT * FROM usuarios")
        resultados = cursor.fetchall()

En este ejemplo, conexion es el objeto de conexión a la base de datos, mientras que cursor es un objeto cursor devuelto por conexion.cursor().__enter__().

Manejo de excepciones dentro del bloque with

Una característica importante del bloque with es su comportamiento con las excepciones:

try:
    with open('archivo_que_no_existe.txt', 'r') as archivo:
        contenido = archivo.read()
except FileNotFoundError:
    print("El archivo no existe, pero el gestor de contexto manejó la limpieza correctamente")

Incluso si ocurre una excepción dentro del bloque with, el método __exit__() del gestor de contexto se ejecutará, garantizando la liberación adecuada de los recursos.

Uso con diferentes tipos de recursos

El bloque with es versátil y puede utilizarse con diversos tipos de recursos:

Conexiones de red:

import socket

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect(('ejemplo.com', 80))
    s.sendall(b'GET / HTTP/1.1\r\nHost: ejemplo.com\r\n\r\n')
    respuesta = s.recv(4096)
# La conexión se cierra automáticamente

Bloqueos para concurrencia:

import threading

lock = threading.Lock()
with lock:
    # Código que requiere acceso exclusivo a un recurso compartido
    datos_compartidos.actualizar()
# El bloqueo se libera automáticamente

Cambios temporales de configuración:

import os
from contextlib import chdir

with chdir('/tmp'):
    # Operaciones en el directorio temporal
    with open('archivo_temp.txt', 'w') as f:
        f.write('datos temporales')
# Volvemos automáticamente al directorio original

Sintaxis en Python 3.10+: asignación de patrón con with

En Python 3.10 y versiones posteriores, se puede combinar la sentencia with con la asignación de patrones:

import json

with open('config.json', 'r') as f:
    if (config := json.load(f)).get('debug'):
        print("Modo depuración activado")

Esta sintaxis permite asignar y utilizar el resultado en una sola línea, haciendo el código más compacto.

Uso con contextlib

El módulo contextlib proporciona herramientas para trabajar con gestores de contexto:

from contextlib import suppress

# Ignora excepciones específicas
with suppress(FileNotFoundError):
    os.remove('archivo_temporal.txt')  # No lanza excepción si el archivo no existe

También permite crear gestores de contexto temporales:

from contextlib import redirect_stdout
import io

buffer = io.StringIO()
with redirect_stdout(buffer):
    print("Este texto se captura en el buffer")
    
resultado_capturado = buffer.getvalue()
print(f"Capturado: {resultado_capturado}")

Buenas prácticas

Al utilizar el bloque with:

  • Mantén el bloque corto y enfocado en las operaciones que necesitan el recurso
  • Evita retornar objetos creados dentro del bloque que dependan del recurso gestionado
  • Prefiere múltiples gestores en una línea en lugar de bloques anidados profundos
  • Libera recursos en orden inverso cuando uses múltiples gestores (el último adquirido es el primero liberado)
# Correcto: el archivo se cierra antes de retornar
def leer_datos(ruta):
    with open(ruta, 'r') as archivo:
        return archivo.read()

# Incorrecto: se retorna un objeto que depende de un recurso que se cerrará
def obtener_lineas(ruta):
    with open(ruta, 'r') as archivo:
        return archivo.readlines()  # Mejor usar list(archivo) para crear una copia

La sentencia with es una herramienta fundamental en Python moderno que promueve un código más limpio, seguro y mantenible al trabajar con recursos que requieren una gestión adecuada.

Ventajas sobre try-finally

Antes de la introducción de los gestores de contexto en Python, el patrón estándar para manejar recursos que requerían inicialización y limpieza era la combinación de bloques try-finally. Esta estructura, aunque funcional, presentaba varios inconvenientes que los gestores de contexto con la sintaxis with han logrado resolver de manera elegante.

Comparación directa de sintaxis

Veamos primero cómo se compara la sintaxis de ambos enfoques para un caso típico como la manipulación de archivos:

# Enfoque tradicional con try-finally
archivo = open('datos.txt', 'r')
try:
    contenido = archivo.read()
    # Procesamiento del contenido
finally:
    archivo.close()
# Enfoque moderno con with
with open('datos.txt', 'r') as archivo:
    contenido = archivo.read()
    # Procesamiento del contenido

La diferencia en legibilidad y concisión es evidente. El código con with comunica claramente la intención y elimina la necesidad de gestionar manualmente el cierre del recurso.

Reducción de código repetitivo

Una de las principales ventajas de los gestores de contexto es la eliminación del código boilerplate. En aplicaciones reales, es común encontrar patrones repetitivos de adquisición y liberación de recursos:

# Con try-finally, el código se vuelve repetitivo
conexion = obtener_conexion_bd()
try:
    cursor = conexion.cursor()
    try:
        cursor.execute("SELECT * FROM usuarios")
        resultados = cursor.fetchall()
    finally:
        cursor.close()
finally:
    conexion.close()

Con gestores de contexto, este código se simplifica notablemente:

with obtener_conexion_bd() as conexion:
    with conexion.cursor() as cursor:
        cursor.execute("SELECT * FROM usuarios")
        resultados = cursor.fetchall()

O incluso más conciso usando múltiples gestores en una línea:

with obtener_conexion_bd() as conexion, conexion.cursor() as cursor:
    cursor.execute("SELECT * FROM usuarios")
    resultados = cursor.fetchall()

Esta reducción de código no solo mejora la legibilidad, sino que también disminuye la probabilidad de errores al eliminar líneas de código que podrían olvidarse.

Prevención de errores comunes

El patrón try-finally es propenso a varios errores sutiles que los gestores de contexto previenen automáticamente:

  • Olvido de la limpieza: Es fácil olvidar incluir el código de limpieza en el bloque finally.
# Error común: olvidar cerrar el archivo
archivo = open('datos.txt', 'r')
try:
    contenido = archivo.read()
except Exception as e:
    print(f"Error: {e}")
# Falta el finally: archivo.close()
  • Errores en el código de limpieza: Si el código de limpieza en el bloque finally genera una excepción, puede enmascarar la excepción original.
# Problema: la excepción en close() enmascara la excepción original
archivo = open('datos.txt', 'r')
try:
    contenido = archivo.read()
    # Si aquí ocurre una excepción...
finally:
    archivo.close()  # ...y aquí ocurre otra, se pierde la primera

Los gestores de contexto manejan estos casos correctamente, preservando la excepción original mientras aseguran que la limpieza se realice.

Manejo de excepciones más sofisticado

El método __exit__() de un gestor de contexto recibe información detallada sobre cualquier excepción que ocurra dentro del bloque with, permitiendo un manejo más sofisticado que el simple try-finally:

class TransaccionBD:
    def __enter__(self):
        self.conexion = obtener_conexion()
        self.conexion.begin()
        return self.conexion
    
    def __exit__(self, tipo_exc, valor_exc, traceback_exc):
        if tipo_exc is None:
            # No hubo excepción, confirmar la transacción
            self.conexion.commit()
        else:
            # Ocurrió una excepción, revertir cambios
            self.conexion.rollback()
        self.conexion.close()
        # No suprimir la excepción
        return False

# Uso
with TransaccionBD() as conexion:
    ejecutar_operaciones_bd(conexion)

Este nivel de control es difícil de lograr con un simple try-finally sin escribir código significativamente más complejo.

Anidamiento más claro

Cuando necesitamos gestionar múltiples recursos, el anidamiento de bloques try-finally se vuelve rápidamente ilegible:

# Anidamiento con try-finally
archivo_entrada = open('entrada.txt', 'r')
try:
    archivo_salida = open('salida.txt', 'w')
    try:
        for linea in archivo_entrada:
            archivo_salida.write(linea.upper())
    finally:
        archivo_salida.close()
finally:
    archivo_entrada.close()

Con gestores de contexto, el código mantiene su claridad incluso con múltiples recursos:

# Anidamiento con with
with open('entrada.txt', 'r') as archivo_entrada:
    with open('salida.txt', 'w') as archivo_salida:
        for linea in archivo_entrada:
            archivo_salida.write(linea.upper())

O mejor aún, usando la sintaxis de múltiples gestores:

# Múltiples gestores en una línea
with open('entrada.txt', 'r') as entrada, open('salida.txt', 'w') as salida:
    for linea in entrada:
        salida.write(linea.upper())

Mejor integración con el modelo de objetos de Python

Los gestores de contexto se integran naturalmente con el modelo de objetos de Python, permitiendo que las clases definan comportamientos de entrada y salida de contexto:

class TemporizadorSimple:
    def __enter__(self):
        self.inicio = time.time()
        return self
    
    def __exit__(self, *args):
        self.fin = time.time()
        self.duracion = self.fin - self.inicio
        print(f"Tiempo transcurrido: {self.duracion:.4f} segundos")

# Uso
with TemporizadorSimple() as timer:
    # Código a medir
    time.sleep(1.5)

Esta capacidad de encapsular comportamientos de contexto en objetos facilita la reutilización y la creación de abstracciones más potentes.

Rendimiento y optimización

Aunque la diferencia de rendimiento suele ser mínima, los gestores de contexto pueden ofrecer optimizaciones que serían complicadas de implementar manualmente con try-finally:

class BufferedWriter:
    def __init__(self, filename):
        self.filename = filename
        self.buffer = []
    
    def write(self, data):
        self.buffer.append(data)
    
    def __enter__(self):
        return self
    
    def __exit__(self, *args):
        # Optimización: escribir todo de una vez al finalizar
        with open(self.filename, 'w') as f:
            f.write(''.join(self.buffer))

# Uso
with BufferedWriter('salida.txt') as writer:
    for i in range(1000):
        writer.write(f"Línea {i}\n")

Este patrón permite implementar estrategias de buffering u otras optimizaciones que se aplican automáticamente al salir del contexto.

Casos de uso específicos

Existen situaciones donde los gestores de contexto brillan especialmente en comparación con try-finally:

  • Cambios temporales de estado: Modificar temporalmente alguna configuración global y restaurarla después.
import os
from contextlib import contextmanager

@contextmanager
def cambiar_directorio(ruta):
    directorio_original = os.getcwd()
    try:
        os.chdir(ruta)
        yield
    finally:
        os.chdir(directorio_original)

# Uso
with cambiar_directorio('/tmp'):
    # Operaciones en el directorio temporal
    print(f"Directorio actual: {os.getcwd()}")
  • Redirección de salida: Capturar temporalmente la salida estándar.
from contextlib import redirect_stdout
import io

f = io.StringIO()
with redirect_stdout(f):
    print("Este texto se captura en lugar de mostrarse")

resultado = f.getvalue()
print(f"Texto capturado: {resultado}")
  • Gestión de recursos remotos: Conexiones a servicios web o APIs.
import requests
from contextlib import contextmanager

@contextmanager
def sesion_api(url_base, token):
    sesion = requests.Session()
    sesion.headers.update({"Authorization": f"Bearer {token}"})
    try:
        yield sesion
    finally:
        sesion.close()

# Uso
with sesion_api("https://api.ejemplo.com", "mi_token") as sesion:
    respuesta = sesion.get("/usuarios")
    datos = respuesta.json()

Resumen de ventajas

En resumen, las principales ventajas de los gestores de contexto sobre try-finally son:

  • Código más conciso y legible
  • Menor propensión a errores de programación
  • Encapsulación mejorada de patrones de uso de recursos
  • Manejo de excepciones más sofisticado
  • Anidamiento más claro para múltiples recursos
  • Mejor integración con el modelo de objetos de Python
  • Posibilidad de optimizaciones específicas de contexto
  • Reutilización más sencilla de patrones comunes

Estas ventajas hacen que los gestores de contexto sean la opción preferida en Python moderno para cualquier situación que involucre la adquisición y liberación de recursos, convirtiendo el uso de try-finally directo en una práctica cada vez menos común y recomendada.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende Python online

Ejercicios de esta lección Contexto with

Evalúa tus conocimientos de esta lección Contexto with con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Módulo math

Python
Puzzle

Reto herencia

Python
Código

Excepciones

Python
Test

Introducción a Python

Python
Test

Reto variables

Python
Código

Funciones Python

Python
Puzzle

Reto funciones

Python
Código

Módulo datetime

Python
Test

Reto acumulación

Python
Código

Reto estructuras condicionales

Python
Código

Polimorfismo

Python
Test

Módulo os

Python
Test

Reto métodos dunder

Python
Código

Diccionarios

Python
Puzzle

Reto clases y objetos

Python
Código

Reto operadores

Python
Código

Operadores

Python
Test

Estructuras de control

Python
Puzzle

Funciones lambda

Python
Test

Reto diccionarios

Python
Código

Reto función lambda

Python
Código

Encapsulación

Python
Puzzle

Reto coleciones

Python
Proyecto

Reto funciones auxiliares

Python
Código

Crear módulos y paquetes

Python
Puzzle

Módulo datetime

Python
Puzzle

Excepciones

Python
Puzzle

Operadores

Python
Puzzle

Diccionarios

Python
Test

Reto map, filter

Python
Código

Reto tuplas

Python
Código

Proyecto gestor de tareas CRUD

Python
Proyecto

Tuplas

Python
Puzzle

Variables

Python
Puzzle

Tipos de datos

Python
Puzzle

Conjuntos

Python
Test

Reto mixins

Python
Código

Módulo csv

Python
Test

Módulo json

Python
Test

Herencia

Python
Test

Análisis de datos de ventas con Pandas

Python
Proyecto

Reto fechas y tiempo

Python
Proyecto

Reto estructuras de iteración

Python
Código

Funciones

Python
Test

Reto comprehensions

Python
Código

Variables

Python
Test

Reto serialización

Python
Proyecto

Módulo csv

Python
Puzzle

Reto polimorfismo

Python
Código

Polimorfismo

Python
Puzzle

Clases y objetos

Python
Código

Reto encapsulación

Python
Código

Estructuras de control

Python
Test

Importar módulos y paquetes

Python
Test

Módulo math

Python
Test

Funciones lambda

Python
Puzzle

Reto excepciones

Python
Código

Listas

Python
Puzzle

Reto archivos

Python
Proyecto

Encapsulación

Python
Test

Reto conjuntos

Python
Código

Clases y objetos

Python
Test

Instalación de Python y creación de proyecto

Python
Test

Reto listas

Python
Código

Tipos de datos

Python
Test

Crear módulos y paquetes

Python
Test

Tuplas

Python
Test

Herencia

Python
Puzzle

Reto acceso a sistema

Python
Proyecto

Proyecto sintaxis calculadora

Python
Proyecto

Importar módulos y paquetes

Python
Puzzle

Clases y objetos

Python
Puzzle

Módulo os

Python
Puzzle

Listas

Python
Test

Conjuntos

Python
Puzzle

Reto tipos de datos

Python
Código

Reto matemáticas

Python
Proyecto

Módulo json

Python
Puzzle

Todas las lecciones de Python

Accede a todas las lecciones de Python y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Python

Python

Introducción

Instalación Y Creación De Proyecto

Python

Introducción

Tema 2: Tipos De Datos, Variables Y Operadores

Python

Introducción

Instalación De Python

Python

Introducción

Tipos De Datos

Python

Sintaxis

Variables

Python

Sintaxis

Operadores

Python

Sintaxis

Estructuras De Control

Python

Sintaxis

Funciones

Python

Sintaxis

Estructuras Control Iterativo

Python

Sintaxis

Estructuras Control Condicional

Python

Sintaxis

Testing Con Pytest

Python

Sintaxis

Listas

Python

Estructuras De Datos

Tuplas

Python

Estructuras De Datos

Diccionarios

Python

Estructuras De Datos

Conjuntos

Python

Estructuras De Datos

Comprehensions

Python

Estructuras De Datos

Clases Y Objetos

Python

Programación Orientada A Objetos

Excepciones

Python

Programación Orientada A Objetos

Encapsulación

Python

Programación Orientada A Objetos

Herencia

Python

Programación Orientada A Objetos

Polimorfismo

Python

Programación Orientada A Objetos

Mixins Y Herencia Múltiple

Python

Programación Orientada A Objetos

Métodos Especiales (Dunder Methods)

Python

Programación Orientada A Objetos

Composición De Clases

Python

Programación Orientada A Objetos

Funciones Lambda

Python

Programación Funcional

Aplicación Parcial

Python

Programación Funcional

Entrada Y Salida, Manejo De Archivos

Python

Programación Funcional

Decoradores

Python

Programación Funcional

Generadores

Python

Programación Funcional

Paradigma Funcional

Python

Programación Funcional

Composición De Funciones

Python

Programación Funcional

Funciones Orden Superior Map Y Filter

Python

Programación Funcional

Funciones Auxiliares

Python

Programación Funcional

Reducción Y Acumulación

Python

Programación Funcional

Archivos Comprimidos

Python

Entrada Y Salida Io

Entrada Y Salida Avanzada

Python

Entrada Y Salida Io

Archivos Temporales

Python

Entrada Y Salida Io

Contexto With

Python

Entrada Y Salida Io

Módulo Csv

Python

Biblioteca Estándar

Módulo Json

Python

Biblioteca Estándar

Módulo Datetime

Python

Biblioteca Estándar

Módulo Math

Python

Biblioteca Estándar

Módulo Os

Python

Biblioteca Estándar

Módulo Re

Python

Biblioteca Estándar

Módulo Random

Python

Biblioteca Estándar

Módulo Time

Python

Biblioteca Estándar

Módulo Collections

Python

Biblioteca Estándar

Módulo Sys

Python

Biblioteca Estándar

Módulo Statistics

Python

Biblioteca Estándar

Módulo Pickle

Python

Biblioteca Estándar

Módulo Pathlib

Python

Biblioteca Estándar

Importar Módulos Y Paquetes

Python

Paquetes Y Módulos

Crear Módulos Y Paquetes

Python

Paquetes Y Módulos

Entornos Virtuales (Virtualenv, Venv)

Python

Entorno Y Dependencias

Gestión De Dependencias (Pip, Requirements.txt)

Python

Entorno Y Dependencias

Python-dotenv Y Variables De Entorno

Python

Entorno Y Dependencias

Acceso A Datos Con Mysql, Pymongo Y Pandas

Python

Acceso A Bases De Datos

Acceso A Mongodb Con Pymongo

Python

Acceso A Bases De Datos

Acceso A Mysql Con Mysql Connector

Python

Acceso A Bases De Datos

Novedades Python 3.13

Python

Características Modernas

Operador Walrus

Python

Características Modernas

Pattern Matching

Python

Características Modernas

Instalación Beautiful Soup

Python

Web Scraping

Sintaxis General De Beautiful Soup

Python

Web Scraping

Tipos De Selectores

Python

Web Scraping

Web Scraping De Html

Python

Web Scraping

Web Scraping Para Ciencia De Datos

Python

Web Scraping

Autenticación Y Acceso A Recursos Protegidos

Python

Web Scraping

Combinación De Selenium Con Beautiful Soup

Python

Web Scraping

Accede GRATIS a Python y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender qué son los gestores de contexto y su protocolo interno.
  • Aprender a utilizar la sentencia with para manejar recursos como archivos, conexiones y bloqueos.
  • Conocer las ventajas de los gestores de contexto frente al uso tradicional de try-finally.
  • Saber crear y anidar múltiples gestores de contexto para gestionar varios recursos simultáneamente.
  • Explorar buenas prácticas y casos de uso comunes para aplicar gestores de contexto en código Python.