Variable defined with with-statement available outside of with-block?
Consider the following example:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
I have read the language docs (2.7) for with-statement as well as PEP-343, but as far as I can tell they don't say anything on this matter.
In CPython 2.6.5 f
does seem to be defined outside of the with-block, but I'd rather not rely on an implementation detail that could change.
Solution 1:
Yes, the context manager will be available outside the with statement and that is not implementation or version dependent. with statements do not create a new execution scope.
Solution 2:
the with
syntax:
with foo as bar:
baz()
is approximately sugar for:
try:
bar = foo.__enter__()
baz()
finally:
if foo.__exit__(*sys.exc_info()) and sys.exc_info():
raise
This is often useful. For example
import threading
with threading.Lock() as myLock:
frob()
with myLock:
frob_some_more()
the context manager may be of use more than once.