Considere o seguinte:
with open(path, mode) as f:
return [line for line in f if condition]
O arquivo será fechado corretamente ou o uso de return
alguma forma ignora o gerenciador de contexto ?
python
return
with-statement
Brisa leve
fonte
fonte
else
pode ser adicionadowith
para resolver essetry with except
problema. edit: adicionado ao idiomaProcess.terminate()
é um dos poucos (o único?) Cenário que não garante a chamada de umafinally
declaração: "Observe que os manipuladores de saída e, finalmente, as cláusulas etc., não serão executado."os._exit
vezes, o @RikPoggi é usado - ele sai do processo Python sem chamar manipuladores de limpeza.with
bloco, a garantia se mantém enquanto o gerador continuar produzindo valores? enquanto alguma coisa referenciar isso?del
Ou seja, eu preciso usar ou atribuir um valor diferente para a variável que contém o objeto gerador?ValueError: I/O operation on closed file.
.Sim.
..é praticamente equivalente a:
Mais precisamente, o
__exit__
método em um gerenciador de contexto é sempre chamado ao sair do bloco (independentemente de exceções, retornos etc.). O__exit__
método do objeto de arquivo apenas chamaf.close()
(por exemplo, aqui no CPython )fonte
finally
keywrod é:def test(): try: return True; finally: return False
.Sim. De maneira mais geral, o
__exit__
método de um Gerenciador de Contexto With Statement será realmente chamado no caso de umreturn
de dentro do contexto. Isso pode ser testado com o seguinte:A saída é:
A saída acima confirma que
__exit__
foi chamado apesar do inícioreturn
. Como tal, o gerenciador de contexto não é ignorado.fonte
Sim, mas pode haver algum efeito colateral em outros casos, porque deve fazer algo (como buffer de liberação) no
__exit__
blocofonte