用with-block之外的with语句定义variables?

考虑下面的例子:

with open('a.txt') as f: pass # Is f supposed to be defined here? 

我已经阅读了语言文档(2.7)以及PEP-343,但据我所知他们在这个问题上什么都没有说。

在CPython 2.6.5中, f似乎是在with-block之外定义的,但我宁愿不依赖于可能改变的实现细节。

是的,上下文pipe理器将在with语句之外提供,这不是实现或版本相关的。 用语句不会创build一个新的执行范围。

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() 

上下文pipe理器可能不止一次地被使用。

如果f是一个文件,它会在with语句之外被closures。

例如,这个

 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的“ 规格说明:与'声明”一节中find详细信息。 Python作用域规则 (这可能令人恼火 )也适用于f

在评论中回答Heikki的问题:是的,这个作用域行为是python语言规范的一部分,可以在任何兼容的Pythons(包括PyPy,Jython和IronPython)上工作。