logo

con declaración en Python

En pitón, con declaración se utiliza 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 la instrucción with hace que el código sea más limpio.

Python3




Python guarda json en un archivo





# file handling> # 1) without using with statement> file> => open>(>'file_path'>,>'w'>)> file>.write(>'hello world !'>)> file>.close()> # 2) without using with statement> file> => open>(>'file_path'>,>'w'>)> try>:> >file>.write(>'hello world'>)> finally>:> >file>.close()>



>

>

Python3




# using with statement> with>open>(>'file_path'>,>'w'>) as>file>:> >file>.write(>'hello world !'>)>

>

cadena a int
>

Tenga en cuenta que, a diferencia de las dos primeras implementaciones, no es necesario llamar a file.close() cuando se utiliza la instrucción with. La declaración with en sí misma garantiza la adquisición y liberación adecuadas de recursos. Una excepción durante la llamada file.write() en la primera implementación puede impedir 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 del ejemplo anterior se ocupa de todas las excepciones, pero el uso de la instrucción with hace que el código sea compacto y mucho más legible. Por lo tanto, la declaración with ayuda a evitar errores y fugas al garantizar que un recurso se libere correctamente cuando el código que lo utiliza se ejecuta por completo. La declaración with se usa popularmente con flujos de archivos, como se muestra arriba, y con bloqueos, sockets, subprocesos y telnets, etc.

Compatible con la declaración with en objetos definidos por el usuario

No hay nada especial en open() que lo haga utilizable con la instrucción with y se puede proporcionar la misma funcionalidad en objetos definidos por el usuario. El soporte con declaraciones en sus objetos garantizará que nunca deje ningún recurso abierto. Para usar la declaración with en objetos definidos por el usuario, solo necesita agregar los métodos __enter__() y __exit__() en los métodos del objeto. Considere el siguiente ejemplo para mayor aclaración.

Python3




número aleatorio entre 1 y 10
# a simple file writer object> 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>,>*>args):> >self>.>file>.close()> # using with statement with MessageWriter> with MessageWriter(>'my_file.txt'>) as xfile:> >xfile.write(>'hello world'>)>

>

>

Examinemos el código anterior. Si te fijas, lo que sigue a la palabra clave with es el constructor de MessageWriter. Tan pronto como la ejecución ingresa al contexto de la declaración with, se crea un objeto MessageWriter y Python llama al método __enter__(). En este método __enter__(), inicializa el recurso que deseas utilizar en el objeto. Este método __enter__() siempre debe devolver un descriptor del recurso adquirido. ¿Qué son los descriptores de recursos? Estos son los identificadores proporcionados por el sistema operativo para acceder a los recursos solicitados. En el siguiente bloque de código, archivo es un descriptor del recurso de flujo de archivos.

Pitón




file> => open>(>'hello.txt'>)>

>

>

En el ejemplo de MessageWriter proporcionado anteriormente, el método __enter__() crea un descriptor de archivo y lo devuelve. El nombre xfile aquí se usa para referirse al descriptor de archivo devuelto por el método __enter__(). El bloque de código que utiliza el recurso adquirido se coloca dentro del bloque de la declaración with. Tan pronto como se ejecuta el código dentro del bloque with, se llama al método __exit__(). Todos los recursos adquiridos se liberan en el método __exit__(). Así es como usamos la declaración with con objetos definidos por el usuario. Esta interfaz de los métodos __enter__() y __exit__() que proporciona soporte para declaraciones with 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 admitir la declaración with en objetos definidos por el usuario. El biblioteca de contexto El módulo proporciona algunas abstracciones más basadas en la interfaz básica del administrador de contexto. Así es como podemos reescribir el administrador de contexto para el objeto MessageWriter usando el módulo contextlib.

Python3




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()> # usage> message_writer>=> MessageWriter(>'hello.txt'>)> with message_writer.open_file() as my_file:> >my_file.write(>'hello world'>)>

int a cadena c++

>

>

En este ejemplo de código, debido a la producir declaración en su definición, la función open_file() es una función generadora . Cuando se llama a esta función open_file(), crea un descriptor de recurso llamado archivo. Este descriptor de recurso luego se pasa a la persona que llama y se representa aquí mediante la variable my_file. Después de ejecutar el código dentro del bloque with, el control del programa regresa a la función open_file(). La función open_file() reanuda su ejecución y ejecuta el código siguiendo la declaración de rendimiento. Esta parte del código que aparece después de la declaración de rendimiento libera los recursos adquiridos. El @contextmanager aquí es un decorador . La implementación anterior basada en clases y esta implementación de administradores de contexto basada en generadores son internamente iguales. Si bien este último parece más legible, requiere conocimiento de generadores, decoradores y rendimiento.