在with-block之外使用with语句定义的变量?

时间:2011-06-21 21:42:49

标签: python

考虑以下示例:

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之外定义,但我宁愿不依赖可能改变的实现细节。

4 个答案:

答案 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)上工作。