参考地址 : https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html
with 上下文管理器
1. Context Management Protocol 包含
__enter__() #[index] //执行顺序-with-body 之前
__exit__() //执行顺序-with-body 之后
2. with context_epression [ as target(s) ]
中的 as 为__enter__()中的return
这里要求return 单个变量(eg: with open(f) as f_index ),
或者 (元祖对象),一定是() 中的内容
3. contextlib模块 ,
- 装饰器 @contextmanager
eg:
清单 9. 装饰器 contextmanager 使用示例
from contextlib import contextmanager
@contextmanager
def demo():
print '[Allocate resources]'
print 'Code before yield-statement executes in __enter__'
yield '*** contextmanager demo ***'
print 'Code after yield-statement executes in __exit__'
print '[Free resources]'
with demo() as value:
print 'Assigned Value: %s' % value
结果输出如下:
清单 10. contextmanager 使用示例执行结果
[Allocate resources]
Code before yield-statement executes in __enter__
Assigned Value: *** contextmanager demo *** #生成器函数中 yield 之前的语句在 __enter__() 方法中执行,yield 之后的语句在 __exit__() 中执行,而 yield 产生的值赋给了 as 子句中的 value 变量
Code after yield-statement executes in __exit__
[Free resources]
没有评论:
发表评论