Considere el siguiente ejemplo:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
He leído los documentos de idioma (2.7) para with-statement y PEP-343, pero por lo que puedo decir, no dicen nada sobre este asunto.
En CPython 2.6.5 fparece estar definido fuera del bloque with, pero prefiero no confiar en un detalle de implementación que podría cambiar.

Respuestas:
Sí, el administrador de contexto estará disponible fuera de la declaración with y eso no depende de la implementación ni de la versión. con declaraciones no crean un nuevo alcance de ejecución.
fuente
la
withsintaxis:with foo as bar: baz()es aproximadamente azúcar para:
try: bar = foo.__enter__() baz() finally: if foo.__exit__(*sys.exc_info()) and sys.exc_info(): raiseSuele resultar útil. Por ejemplo
import threading with threading.Lock() as myLock: frob() with myLock: frob_some_more()el administrador de contexto puede ser útil más de una vez.
fuente
En caso de que
fsea un archivo, aparecerá cerrado fuera delwithestado de cuenta.Por ejemplo, este
f = 42 print f with open('6432134.py') as f: print f print fimprimiría:
42 <open file '6432134.py', mode 'r' at 0x10050fb70> <closed file '6432134.py', mode 'r' at 0x10050fb70>Puede encontrar los detalles en PEP-0343 en la sección Especificación: La declaración 'con' . Las reglas de alcance de Python (que pueden ser irritantes ) también se aplican
f.fuente
[x for x in [1]].xestá disponible fuera de eso. Convertirlo en un generador:(x for x in [1]). Ahoraxno está disponible. Creo recordar que esto se cambió en Python 3 para que incluso con la comprensión de la listaxno se filtrara, pero ahora no puedo encontrar la referencia.Para responder a la pregunta de Heikki en los comentarios: sí, este comportamiento de alcance es parte de la especificación del lenguaje Python y funcionará en todas y cada una de las Pythons compatibles (que incluyen PyPy, Jython e IronPython).
fuente