in

con declaración en Python – GeeksforGeeks

gfg 200x200 min

with La declaración en Python se usa en el manejo de excepciones para hacer que el código sea más limpio y mucho más legible. Simplifica la gestión de recursos comunes como flujos de archivos. Observe el siguiente ejemplo de código sobre cómo el uso de with declaración hace que el código sea más limpio.

 

file = open('file_path', 'w')

file.write('hello world !')

file.close()

 

file = open('file_path', 'w')

try:

    file.write('hello world')

finally:

    file.close()

with open('file_path', 'w') as file:

    file.write('hello world !')

Tenga en cuenta que, a diferencia de las dos primeras implementaciones, no es necesario llamar file.close() cuando usas with declaración. los with declaración en sí asegura la adquisición y liberación adecuadas de recursos. Una excepción durante el file.write() llamar en la primera implementación puede evitar que el archivo se cierre correctamente, lo que puede introducir varios errores en el código, es decir, muchos cambios en los archivos no entran en vigor hasta que el archivo se cierra correctamente.

El segundo enfoque en el ejemplo anterior se encarga de todas las excepciones, pero utilizando el with La declaración hace que el código sea compacto y mucho más legible. Por lo tanto, with La declaración ayuda a evitar errores y fugas al garantizar que un recurso se libera correctamente cuando el código que usa el recurso se ejecuta por completo. los with La declaración se usa popularmente con flujos de archivos, como se muestra arriba y con bloqueos, sockets, subprocesos y telnets, etc.

Apoyando la declaración «con» en objetos definidos por el usuario

No hay nada especial en open() lo que lo hace utilizable con el with declaración y la misma funcionalidad se puede proporcionar en objetos definidos por el usuario. Secundario with declaración en sus objetos asegurará que nunca deje ningún recurso abierto.
Usar with declaración en objetos definidos por el usuario, solo necesita agregar los métodos __enter__() y __exit__() en los métodos de objeto. Considere el siguiente ejemplo para mayor aclaración.

 

class MessageWriter(object):

    def __init__(self, file_name):

        self.file_name = file_name

     

    def __enter__(self):

        self.file = open(self.file_name, 'w')

        return self.file

 

    def __exit__(self):

        self.file.close()

 

 

with MessageWriter('my_file.txt') as xfile:

    xfile.write('hello world')

Examinemos el código anterior. Si nota, lo que sigue a la with palabra clave es el constructor de MessageWriter. Tan pronto como la ejecución entra en el contexto de la with declaración a MessageWriter se crea el objeto y Python luego llama al __enter__() método. En esto __enter__() método, inicialice el recurso que desea utilizar en el objeto. Esta __enter__() El método siempre debe devolver un descriptor del recurso adquirido.

¿Qué son los descriptores de recursos?
Estos son los identificadores que proporciona el sistema operativo para acceder a los recursos solicitados. En el siguiente bloque de código, file es un descriptor del recurso de flujo de archivos.

En el MessageWriter ejemplo proporcionado anteriormente, el __enter__() El método crea un descriptor de archivo y lo devuelve. El nombre xfile aquí se utiliza para hacer referencia al descriptor de archivo devuelto por el __enter__() método. El bloque de código que utiliza el recurso adquirido se coloca dentro del bloque del with declaración. Tan pronto como el código dentro del with se ejecuta el bloque, el __exit__() se llama al método. Todos los recursos adquiridos se liberan en el __exit__() método. Así es como usamos el with declaración con objetos definidos por el usuario.

Esta interfaz de __enter__() y __exit__() métodos que proporcionan el apoyo de with declaración en objetos definidos por el usuario se llama Administrador de contexto.

El módulo contextlib

Un administrador de contexto basado en clases como se muestra arriba no es la única forma de with declaración en objetos definidos por el usuario. los contextlib El módulo proporciona algunas abstracciones más construidas sobre la interfaz básica del administrador de contexto. Así es como podemos reescribir el administrador de contexto para el MessageWriter objeto usando el contextlib módulo.

from contextlib import contextmanager

 

class MessageWriter(object):

    def __init__(self, filename):

        self.file_name = filename

 

    @contextmanager

    def open_file(self):

        try:

            file = open(self.file_name, 'w')

            yield file

        finally:

            file.close()

 

message_writer = MessageWriter('hello.txt')

with message_writer.open_file() as my_file:

    my_file.write('hello world')

En este ejemplo de código, debido a la yield declaración en su definición, la función open_file() es una función generadora.
Cuando esto open_file() se llama a la función, crea un descriptor de recurso llamado file. Este descriptor de recursos se pasa luego al llamador y se representa aquí mediante la variable my_file. Después del código dentro del with se ejecuta el bloque, el control del programa vuelve al open_file() función. los open_file() La función reanuda su ejecución y ejecuta el código siguiendo el yield declaración. Esta parte del código que aparece después de la yield declaración libera los recursos adquiridos. los @contextmanager aquí hay un decorador.

La implementación anterior basada en clases y esta implementación basada en generadores de administradores de contexto es internamente la misma. Si bien el último parece más legible, requiere el conocimiento de generadores, decoradores y yield.

¡Atención friki! Fortalece tus cimientos con el Fundación de programación de Python Curso y aprende los conceptos básicos.

Para empezar, los preparativos de su entrevista Mejore sus conceptos de estructuras de datos con el Python DS Curso. Y para comenzar con su viaje de aprendizaje automático, únase al Aprendizaje automático – Curso de nivel básico

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

apple touch icon@2

estructuras de datos: ¿cómo puedo implementar un árbol en Python?

Bearpaw vs Uggs – Diferencia y comparación