CodeGym /Cursos /Python SELF ES /Operador with

Operador with

Python SELF ES
Nivel 21 , Lección 3
Disponible

4.1 Cierre de archivos y manejo de errores

A veces, al leer un archivo, ocurren errores o excepciones, y el archivo queda sin cerrar. Esto puede potencialmente llevar a una fuga de memoria o una fuga de file handlers. Por eso, trabajar con archivos debe estar envuelto en un bloque try-except.

Supongamos que tienes el siguiente código:


file = open('example.txt', 'a') # Abrimos el archivo
file.write("This is a new line added to the file.")
file.close()  # Cerramos el archivo

Es necesario envolverlo en un bloque try-except:


try:
    file = open('example.txt', 'a')  # Abrimos el archivo
    file.write("This is a new line added to the file.")
    file.close()  # Cerramos el archivo
except FileNotFoundError:
    print("File not found")
    file.close()  # Cerramos el archivo

Para no escribir el método close() dos veces, se puede colocar en un bloque finally:


try:
    file = open('example.txt', 'a')  # Abrimos el archivo
    file.write("This is a new line added to the file.")
except FileNotFoundError:
    print("File not found")
finally:
    file.close()  # Cerramos el archivo

Este código se ve bonito, pero... no funciona, ya que la variable file solo está definida dentro del bloque try y no está accesible desde los bloques except y finally.

Por lo tanto, necesitamos definir la variable en un nivel superior:


file = None
try:
    file = open('example.txt', 'a')  # Abrimos el archivo
    file.write("This is a new line added to the file.")
except FileNotFoundError:
    print("File not found")
finally:
    file.close()  # Cerramos el archivo

Esta solución es mejor, pero también tiene desventajas. Por ejemplo, si el archivo nunca llega a abrirse, la variable file tendrá None. Entonces, intentar cerrar el archivo provocará un error, ya que será un intento de acceder al método close() en un objeto inexistente.

Por eso, necesitamos agregar una verificación antes de llamar al método close():


file = None
try:
    file = open('example.txt', 'a')  # Abrimos el archivo
    file.write("This is a new line added to the file.")
except FileNotFoundError:
    print("File not found")
finally:
    if file:
        file.close()  # Cerramos el archivo

Si te sorprende que 3 líneas de código se hayan convertido en 9, no estás solo. Afortunadamente, ya hay una solución lista para este problema, de la que hablaremos a continuación.

4.2 Operador with

El operador with en Python proporciona una forma conveniente de manejar recursos, como archivos, asegurando su cierre automático después de completar el bloque with. Esto simplifica el código y previene fugas de recursos, como archivos no cerrados.

Sintaxis general del operador with:


with expresión as variable:
    trabajo con la variable

El operador with se usa para envolver la ejecución de un bloque de código con un administrador de contexto. Al usar el operador with, Python automáticamente llama a los métodos __enter__() y __exit__() del objeto administrador de contexto, lo que facilita el manejo de recursos.

Ejemplo de uso de with para trabajar con archivos:


with open('example.txt', 'w') as file:
    file.write("Hello, World!\n")
    file.write("This is a test file.\n")

En este ejemplo, el archivo example.txt se abre en modo de escritura, y el nombre del archivo se asocia con la variable file. El bloque de código dentro del with cierra automáticamente el archivo después de realizar todas las operaciones de escritura.

4.3 Cierre automático de archivos

Una de las principales ventajas de usar el operador with es el cierre automático del archivo después de completar el bloque de código. Esto sucede incluso si ocurre una excepción, lo que hace que el código sea más seguro y confiable.

Ejemplo de cierre automático del archivo:


try:
    with open('example.txt', 'w') as file:
        file.write("Hello, World!\n")
        file.write("This is a test file.\n")
        # Excepción para verificar que el archivo se cierra de todos modos
        raise Exception("Something went wrong")
except Exception as e:
    print(f"Caught an exception: {e}")
# En este punto, el archivo ya está cerrado

Siempre usa el operador with al trabajar con archivos. Es simple y te permite evitar muchos errores.

4.4 Bajo el capó del operador with

En la base del funcionamiento del operador with están los métodos __enter__() y __exit__(), que deben ser implementados en la clase que se usa como administrador de contexto.

Para que un objeto pueda usarse con el operador with, debe implementar los métodos __enter__() y __exit__(). Estos métodos definen el comportamiento al entrar y salir del contexto.

Método __enter__()

El método __enter__() se llama al entrar en el bloque with. Realiza la inicialización del recurso y devuelve el objeto que se asociará a la variable indicada después de as.

Método __exit__()

El método __exit__() se llama al salir del bloque with. Realiza acciones finales, como liberar recursos o cerrar archivos. El método acepta tres argumentos: exc_type, exc_val y exc_tb, que contienen información sobre la excepción si ocurrió.

  • exc_type: tipo de excepción (por ejemplo, ZeroDivisionError).
  • exc_val: valor de la excepción (por ejemplo, mensaje de error).
  • exc_tb: traza de la pila de la excepción.

Si el método __exit__() devuelve True, la excepción será suprimida. Si devuelve False, la excepción se lanzará nuevamente.

Ejemplo:


class MyContextManager:
    def __enter__(self):
        print("Entering the context")
        return self
        
    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            print(f"An exception occurred: {exc_type}, {exc_val}")
        return False  # La excepción no se suprime
        
with MyContextManager() as manager:
    print("Inside the with block")
2
Tarea
Python SELF ES, nivel 21, lección 3
Bloqueada
Manejo de errores al trabajar con archivos
Manejo de errores al trabajar con archivos
2
Tarea
Python SELF ES, nivel 21, lección 3
Bloqueada
Uso del operador with para trabajar con archivos
Uso del operador with para trabajar con archivos
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION