contextlib模块中包含的工具用于处理上下文管理器和with语句
上下文管理器由with语句启用,执行流进入with中的代码块会运行__enter__()方法,它返回在这个上下文中使用的一个对象,执行流离开with块时,则执行上下文管理的__exit__(exc_type,exc_val,exc_tb)方法,如没有发生异常,这三个参数都为None,否则,它们包含与控制流离开上下文的异常相关类型、值、和跟踪信息,例如自定义一个上下文管理
class Context:
def __init__(self):
print('__init__')
def __enter__(self):
print('__enter__')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
# print('exc_type:{},exc_val:{},exc_tb{}'.format(exc_type,exc_val,exc_tb))
with Context() as c:
print('doing work in context')
# print(1+'1')
#没有报错输出:
__init__
__enter__
doing work in context
__exit__
报错的输出:
class Context:
def __init__(self):
print('__init__')
def __enter__(self):
print('__enter__')
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print('__exit__')
print('exc_type:{},exc_val:{},exc_tb{}'.format(exc_type,exc_val,exc_tb))
with Context() as c:
print('doing work in context')
print(1+'1')
__init__
Traceback (most recent call last):
__enter__
doing work in context
File "D:/python_project/Python之路/day01/上下文管理器.py", line 13, in <module>
__exit__
exc_type:<class 'TypeError'>,exc_val:unsupported operand type(s) for +: 'int' and 'str',exc_tb<traceback object at 0x00000273A4997388>
print(1+'1')
TypeError: unsupported operand type(s) for +: 'int' and 'str'