É possível declarar mais de uma variável usando uma with
instrução em Python?
Algo como:
from __future__ import with_statement
with open("out.txt","wt"), open("in.txt") as file_out, file_in:
for line in file_in:
file_out.write(line)
... ou está limpando dois recursos ao mesmo tempo, o problema?
python
with-statement
baiacu
fonte
fonte
Respostas:
É possível no Python 3 desde a v3.1 e Python 2.7 . A nova
with
sintaxe suporta vários gerenciadores de contexto:Diferentemente do
contextlib.nested
, isso garante quea
eb
terão seus__exit__()
chamados mesmoC()
que o__enter__()
método suscite uma exceção.Você também pode usar variáveis anteriores em definições posteriores (h / t Ahmad abaixo):
fonte
with open('./file') as arg.x = file:
?as
é opcional.as
é necessário se você precisar do objetoa
oub
, mas o todoas a
ouas b
não for necessáriocontextlib.nested
suporta isso:Atualização:
Para citar a documentação, referente a
contextlib.nested
:Veja a resposta de Rafał Dowgird para mais informações.
fonte
nested
gerenciador de contexto é um erro e nunca deve ser usado. Neste exemplo, se a abertura do segundo arquivo gerar uma exceção, o primeiro arquivo não será fechado, destruindo totalmente o objetivo de usar gerenciadores de contexto.with
blocos aninhados padrão . Os gerentes são criados em ordem antes de inserir os blocos with: m1, m2, m3 = A (), B (), C () Se B () ou C () falharem com exceção, sua única esperança de finalizar corretamente A ( ) é o coletor de lixo.Observe que, se você dividir as variáveis em linhas, deverá usar barras invertidas para quebrar as novas linhas.
Parênteses não funcionam, pois o Python cria uma tupla.
Como as tuplas não possuem um
__enter__
atributo, você recebe um erro (não descritivo e não identifica o tipo de classe):Se você tentar usar
as
entre parênteses, o Python detectará o erro no momento da análise:https://bugs.python.org/issue12782 parece estar relacionado a esse problema.
fonte
Eu acho que você quer fazer isso:
fonte
Desde o Python 3.3, você pode usar a classe
ExitStack
docontextlib
módulo.Ele pode gerenciar um número dinâmico de objetos sensíveis ao contexto, o que significa que será especialmente útil se você não souber quantos arquivos manipulará.
O caso de uso canônico mencionado na documentação está gerenciando um número dinâmico de arquivos.
Aqui está um exemplo genérico:
Resultado:
fonte
No Python 3.1+, você pode especificar várias expressões de contexto, e elas serão processadas como se várias
with
instruções estivessem aninhadas:é equivalente a
Isso também significa que você pode usar o alias da primeira expressão na segunda (útil ao trabalhar com conexões / cursores db):
fonte