Considere o seguinte exemplo:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
Eu li a documentação da linguagem (2.7) para with-statement e também para PEP-343, mas pelo que eu posso dizer eles não dizem nada sobre este assunto.
No CPython 2.6.5 f
parece estar definido fora do bloco com, mas prefiro não confiar em um detalhe de implementação que possa mudar.
Respostas:
Sim, o gerenciador de contexto estará disponível fora da instrução with e isso não depende da implementação ou da versão. com instruções não criam um novo escopo de execução.
fonte
a
with
sintaxe:é aproximadamente açúcar para:
Isso geralmente é útil. Por exemplo
o gerenciador de contexto pode ser útil mais de uma vez.
fonte
Caso
f
seja um arquivo, ele aparecerá fechado fora dowith
extrato.Por exemplo, este
imprimiria:
Você pode encontrar os detalhes no PEP-0343 na seção Especificação: A declaração 'com' . As regras de escopo do Python (que podem ser irritantes ) também se aplicam
f
.fonte
[x for x in [1]]
.x
está disponível fora disso. Faça-o em um gerador:(x for x in [1])
. Agorax
não está disponível. Parece que me lembro que isso foi alterado no Python 3 para que mesmo com a compreensão da listax
não vazasse, mas não consigo encontrar a referência agora.Para responder à pergunta de Heikki nos comentários: sim, esse comportamento de escopo é parte da especificação da linguagem python e funcionará em todo e qualquer Pythons compatível (que inclui PyPy, Jython e IronPython).
fonte