取得原谅比获得许可容易
else块
else子句不仅能在if语句中使用,还能在for、while和try语句中使用。
for
仅当for循环运行完毕(没有被break语句终止)才运行else块
while
仅当while循环因条件为假值而退出(没有被break语句终止)才运行else块
try
仅当try块中没有异常抛出时才运行else块
with块
with不仅能管理资源,还能用于去掉常规的设置和清理代码,或者在另一个过程前后只想的操作。
with语句的目的是简化try/finally
模式
这种模式用于保证一段代码运行完毕后执行某项操作,即使那段代码由于异常
、return
或sys.exit()
调试而中止,也会执行指定的操作
with语句开始的时候会在上下文管理对象上调用
__enter__
方法with语句结束的时候户在上下文管理对象上调用
exit
方法
exit的三个参数
def __exit__(self, exc_type, exc_value, traceback)
exc_type:异常类
exc_value:异常实例
有时会有参数传给异常构方法,例如错误消息,这些参数可以使用exc_value.args
获取
trackback:异常的堆栈信息
使用@contextmanager
不用编写完整的__enter__
与__exit__
函数,只需要实现有一个yield
语句的生成器
yield把函数分为了两部分,
上半部分相当于
enter
中的内容下半部分相当于
exit
中的内容
class A(object):
def __enter__(self):
print("进入")
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出")
if __name__ == '__main__':
with A():
print('test')
assert 0
import contextlib
@contextlib.contextmanager
def B():
print("进入")
try:
yield
finally:
print("退出")
if __name__ == '__main__':
with B() as b:
print('test1')
assert 0
上述两段代码的实现效果是一样的