引子
在学习文件操作时,学习到一个with语句,可以实现自动关闭文件操作,而不需要手动的增加异常处理以及显示的调用close
来关闭文件。这样即减少了遗漏关闭文件导致的资源泄漏,代码结构也更易于理解维护,文件操作一节使用的例子如下
with open("test.txt") as f:
for line in f:
print(line)
在退出with语句时,不管是正常退出,还是出现异常,文件都会被正常关闭。
上下文管理器
上下文管理器是这样一个对象:定义程序运行时需要建立的上下文,处理程序的进入和退出。即用来创建一个运行时环境。
上下文管理器对象需要实现两个方法:
-
__enter__()
,进入运行时的上下文,返回运行时上下文相关的对象,即处理程序的进入。 -
__exit__(exception_type, exception_value, traceback)
,退出运行时上下文,定义在块执行(或终止)之后上下文管理器应该做的动作。像前面说的关闭文件
实现了这两个方法的对象都可以称为一个上下文管理器,也可以用在with语句中。也即可以自定义上下文管理器类,并使用with语句来简化使用。
最常用的还是文件操作,和网络socketr操作。
with语句分析
语法
with expr [as target]:
code
with语句可以嵌套使用,如下
with expr1 as e1:
--code--
with expr2 as e2:
--code--
with语句执行过程
- 计算表达式的值,返回一个上下文管理器对象。
- 加载上下文管理器对象的
__exit__()
方法以备后用。 - 调用上下文管理器对象的
__enter__()
方法。 - 如果使用了
[as target]
,则将__enter__()
的返回值赋值给target
。 - 执行with语句中的代码块。
- 如果步骤5中代码正常结束,调用
__exit__()
方法并忽略返回值。 - 如果步骤5中代码执行异常,调用
__exit__()
方法,并将异常类型、值、traceback信息作为参数传递给此方法并判断返回值:如果为false则异常重新抛出;如果为true异常被挂起,程序继续执行。
参考
本节参数书箱《编写高质量代码--改善python程序的91个建议》
网友评论