考虑以下示例:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
我已经阅读了with-statement和PEP-343的语言文档(2.7),但据我所知,他们没有就此问题发表任何言论。
在CPython 2.6.5中f
似乎确实在with-block之外定义,但我宁愿不依赖可能改变的实现细节。
答案 0 :(得分:138)
是的,上下文管理器将在with语句之外可用,并且不依赖于实现或版本。 with statements 不创建新的执行范围。
答案 1 :(得分:25)
with
语法:
with foo as bar:
baz()
大约是糖:
try:
bar = foo.__enter__()
baz()
finally:
if foo.__exit__(*sys.exc_info()) and sys.exc_info():
raise
这通常很有用。例如
import threading
with threading.Lock() as myLock:
frob()
with myLock:
frob_some_more()
上下文管理器可能不止一次使用。
答案 2 :(得分:16)
如果f
是一个文件,它将在with
语句之外显示为已关闭。
例如,这个
f = 42
print f
with open('6432134.py') as f:
print f
print f
会打印:
42
<open file '6432134.py', mode 'r' at 0x10050fb70>
<closed file '6432134.py', mode 'r' at 0x10050fb70>
您可以在规范:'with'Statement 部分的PEP-0343中找到详细信息。 Python scope rules(可能是irritating)也适用于f
。
答案 3 :(得分:11)
在评论中回答Heikki的问题:是的,这个范围行为是python语言规范的一部分,可以在任何和所有兼容的Pythons(包括PyPy,Jython和IronPython)上工作。