Considera lo siguiente:
with open(path, mode) as f:
return [line for line in f if condition]
¿El archivo se cerrará correctamente, o el uso de returnalguna manera omite el administrador de contexto ?
python
return
with-statement
Brisa ligera
fuente
fuente

elsepodría agregarsewithpara resolver esetry with exceptproblema. editar: agregado al idiomaProcess.terminate()es uno de los pocos (¿el único?) Escenario que no garantiza la llamada de unafinallydeclaración: "Tenga en cuenta que los controladores de salida y finalmente las cláusulas, etc., no serán ejecutado."os._exitveces se usa: sale del proceso de Python sin llamar a los controladores de limpieza.withpasa si devuelvo una expresión de generador desde dentro del bloque, la garantía se mantiene mientras el generador siga produciendo valores? durante todo el tiempo que lo haga referencia? Es decir, ¿necesito usardelo asignar un valor diferente a la variable que contiene el objeto generador?ValueError: I/O operation on closed file..Si.
..es más o menos equivalente a:
Más exactamente, el
__exit__método en un administrador de contexto siempre se llama al salir del bloque (independientemente de las excepciones, devoluciones, etc.). El__exit__método del objeto de archivo solo llamaf.close()(por ejemplo, aquí en CPython )fuente
finallykeywrod es:def test(): try: return True; finally: return False.Si. En términos más generales, el
__exit__método de un Administrador de contexto de declaración con se llamará en el caso de unreturndesde dentro del contexto. Esto se puede probar con lo siguiente:El resultado es:
El resultado anterior confirma que
__exit__fue llamado a pesar de lo tempranoreturn. Como tal, el administrador de contexto no se omite.fuente
Sí, pero puede haber algún efecto secundario en otros casos, ya que podría hacer algo (como búfer de lavado) en el
__exit__bloquefuente