La instrucción with en Python

Manav Narula 21 junio 2023
  1. Use la instrucción with en Python
  2. Conclusión
La instrucción with en Python

Python proporciona una variedad de características y opciones para mejorar nuestro código existente. Una de esas características es la palabra clave con.

Este tutorial demostrará la función de la instrucción with y sus aplicaciones en Python.

Use la instrucción with en Python

Esta declaración se usa esencialmente para ayudar a manejar las excepciones y aclarar los recursos a medida que se usan. Garantiza que el código se ejecute correctamente y que los recursos se limpien después.

En su mayoría, encontrará el uso de la declaración with en el manejo de archivos. Discutamos un ejemplo.

f = open("path\file.txt", "w")
f.write("Sample Content")
f.close()

En el ejemplo anterior, abrimos un archivo usando la función open() y escribimos algo de contenido usando el método write(). Luego, la función close() cerró el objeto de archivo y limpió los recursos.

Veamos cómo se ve el código anterior con la palabra clave with.

with open("path\file.txt") as f:
    f.write("Sample Content")

En el código podemos ver que, usando la sentencia with, pudimos eliminar el uso de la función close().

Otro caso en el que la instrucción with puede ser útil es encapsular los bloques try y finally.

Por ejemplo,

f = open("path\file.txt", "w")
try:
    f.write("Sample Content")
finally:
    f.close()

El bloque try toma un código como abrir un archivo, y el código en el bloque finally se ejecuta independientemente de si el código en el bloque try genera una excepción. En el ejemplo anterior, el código en el bloque finalmente se ejecutará y ejecutará la función cerrar(), incluso si la función escribir() genera una excepción.

Hemos visto cómo podemos lograr esto utilizando la declaración con en el ejemplo anterior.

También podemos usar la instrucción with con objetos definidos por el usuario, y dichos objetos se conocen como administradores de contexto. Tienen definido un método __enter__ y __exit__.

El método __enter__ se ejecuta al crear un objeto de esta clase utilizando la instrucción with. El método __exit__ se ejecuta cuando finaliza el código del bloque with.

class writer_class(object):
    def __init__(self, filename):
        self.filename = filename

    def __enter__(self):
        self.f = open(self.filename, "w")
        return self.f

    def __exit__(self, exception, value):
        self.f.close()


with writer_class("file.txt") as f:
    f.write("DelftStack")

Los objetos de la clase anterior en Python ejecutan el método __enter__ cuando se crean, que se utiliza para abrir el archivo. La función close() se coloca dentro del método __exit__ para cerrar el objeto de archivo cuando se ha ejecutado el código.

Al igual que las clases, podemos usar la biblioteca contextlib para crear métodos de gestión de contexto. Estos métodos se pueden realizar utilizando el decorador @contextmanager, que se antepone a la función definida.

Por ejemplo,

from contextlib import contextmanager


@contextmanager
def new_open(file):
    try:
        f = open(file, "w")
        yield f
    finally:
        f.close()


with new_open("sample.txt") as f:
    f.write("DelftStack")

En el código de ejemplo, podemos ver el uso del decorador @contextmanager que nos permite crear dichos métodos. En la función definida, ponemos el código completo para crear el objeto de archivo y cerrar el objeto creado usando los bloques intentar y finalmente.

Conclusión

Para concluir, discutimos la declaración with en Python y sus usos. Primero discutimos los conceptos básicos de esta declaración y cómo mejora la legibilidad y la eficiencia del código al limpiar los recursos.

Nos enfocamos en su aplicación más común con el manejo de archivos para demostrar su uso. También discutimos el administrador de contexto y sus métodos y cómo podemos usar la declaración con con ellos.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Artículo relacionado - Python Keyword