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 f
parece 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
with
sintaxis: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(): raise
Suele 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
f
sea un archivo, aparecerá cerrado fuera delwith
estado de cuenta.Por ejemplo, este
f = 42 print f with open('6432134.py') as f: print f print f
imprimirí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]]
.x
está disponible fuera de eso. Convertirlo en un generador:(x for x in [1])
. Ahorax
no está disponible. Creo recordar que esto se cambió en Python 3 para que incluso con la comprensión de la listax
no 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