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