深入理解Python之Context Manager
### 概述
本文主要讨论Python
中的控制流特性
with
和context manager
else
在for,while,try
中的使用
with
表达式创建临时可靠的上下文。这能防止错误和减少模板代码,使API
更便于使用和更安全。经常能够发现使用with
表达式能够实现文件的自动关闭。
先做这个,然后做那个:if之后是else块
for
: 循环执行完并且没有执行if
1
2
3
4
5for item in my_list:
if item.flavor == 'banana':
break
else:
raise ValueError(‘No banana flavor found!')- while: 当循环条件变成
false
,循环退出执行 - try: 当
try
块中没有抛出异常执行1
2
3
4
5
6
7try:
dagerour_call()
after_call()
except OSError:
log('OSError')
else:
after_call()
Context Manager和with
上下文管理器对象用于管理with
表达式,就像迭代器用于管理for
表达式
with
表达式被设计用来简化try/finally
模式,保证某些操作最后一定能够执行。
上下文管理器协议包含__enter__
和__exit__
方法.with
开始,__enter__
触发,而__exit__
扮演了finally
的角色,离开with
块执行
1 | with open('mirror.py') as fp: |
上述代码打开文件,结束之后会自动关闭文件
1 | class LookingGlass: |
contextib工具
- closing: 创建对象上下文管理器,提供
close
方法,不需要实现__enter__
和__exit__
- suppress: 上下文管理器临时忽略指定的异常
- @contextmanager: 直接生成上下文管理器,而不需要实现
__enter__
和__exit__
- ContextDecorator: 上下文管理器装饰器基类
- ExitStack: 能够进入几个上下文管理器。当
with
块结束,其会使用后进先出调用栈中的上下文管理器的__exit__
@contextmanager
@contextmanager
减少创建上下文管理器的模板代码。使用@contextmanager
时,yield
会将函数分成两部分,之前的部分会在__enter__
中执行,之后的部分会在__exit__
中执行
1 |
|