1. 先看一个例子
with open('./test.txt', 'wb') as f:
f.write('aaaaaaaaaaaa')
上例等价于下面的代码:
f = open('./test.txt', 'wb')
try:
f.write('aaaaaaaaaaaa')
except Exception:
pass
finally:
f.close
可见, 当使用with时,with open('./test.txt', 'wb') as f:
就是将open出来的文件描述符as为f,之后再对f进行写数据,写完数据后with这个上下文管理器会将f进行close, 并且能够捕获异常
因此with是一个上下文管理器
2. with上下文管理器原理
我们通过自定义一个类来理解with的原理。
class ContextManager(object):
def __enter__(self): #进入with语句时调用
print("__enter__ called")
def __exit__(self, exc_type, exc_val, exc_tb): #离开with语句时调用
print('__exit__ called')
print('exc_type: %s' % exc_type) #异常类型
print('exc_val: %s' % exc_val) #异常值
print('exc_tb: %s' % exc_tb) #异常追踪信息
#debug1
with ContextManager() as cm:
print('hello python')
#debug 2
with ContextManager() as cm:
a = 1 / 0
print('hello python')
网友评论