上下文管理器 (context manager) 是Python2.5开始支持的一种语法,用于规定某个对象(往往是类实例对象)的使用范围。一旦进入或者离开,这会触发相应的生命钩子(enter 和exit)函数,在钩子函数中可以定义,特殊操作例如,对象分配或者释放内存甚至如下的回收文件句柄。调用构建有钩子函数的类实例时,往往依赖形式为with…as…的语法。
with open("file.txt", "w") as f:
f.write("Hello World!")
"""
def __exit__(self, *excinfo): # real signature unknown; restored from __doc__
# __exit__(*excinfo) -> None. Closes the file.
pass
"""
# 离开 with···as···的语法范围将 触发 __exit__ ,在该函数下定义了关闭方法
print(f.closed) # True
自定义管理器
class CustomManage(object):
def __init__(self, arg=None):
self.arg = arg
def __enter__(self):
return '---enter---'
def __exit__(self, exc_type, exc_value, traceback):
print '---exit---'
print exc_type, exc_value, traceback
if __name__ == '__main__':
try:
with CustomManage() as cm:
print '---start---'
print cm
print '---end---'
except Exception as e:
print e运行结果
---start---
---enter---
---end---
None None None
---exit---- 其中, exc_type, exc_value, traceback 为向CustomManage实例对象内部内部传递的异常信息,若无没有这都为None
若有,则如下
if __name__ == '__main__':
try:
with CustomManage() as cm:
print '---start---'
print cm
raise ValueError('引发一个错误')
print '---end---'
except Exception as e:
print e # 异常详情在此处打印结果如下
---start---
---enter---
<type 'exceptions.ValueError'> 引发一个错误 <traceback object at 0x0000000002B23D48>
---exit---
引发一个错误- 此时,当抛出一个异常后,print ‘—end—’ 并没有自信,with ···as···至此截止,结束钩子函数_ exit _() 依旧被执行
版权声明:本文为ChangerJJLee原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。