考虑以下示例:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
我已经阅读过带声明的语言文档(2.7)以及PEP-343,但据我所知,他们对此事一言不发。
在CPython 2.6.5 f中,似乎确实是在with块之外定义的,但是我宁愿不要依赖于可能发生变化的实现细节。
考虑以下示例:
with open('a.txt') as f:
pass
# Is f supposed to be defined here?
我已经阅读过带声明的语言文档(2.7)以及PEP-343,但据我所知,他们对此事一言不发。
在CPython 2.6.5 f中,似乎确实是在with块之外定义的,但是我宁愿不要依赖于可能发生变化的实现细节。
Answers:
是的,上下文管理器将在with语句之外可用,并且与实现或版本无关。with语句不会创建新的执行范围。
该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()
上下文管理器可能会多次使用。
如果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>
您可以在PEP-0343的“ 规范:'with'语句”部分下找到详细信息。Python范围规则(可能会令人讨厌)也适用f。
[x for x in [1]]。x在那之外可用。使其成为生成器:(x for x in [1])。现在x不可用。我似乎记得在Python 3中对此进行了更改,因此即使有了列表理解x也不会泄漏,但是我现在找不到引用。