with 表达式 [as 目标]:
代码块
with open('test.txt', 'w') as f:
f.write('test')
使用with语句能保证当写操作执行完毕后自动关闭文件。
with语句可以在代码块执行完毕后还原进入该代码块时的现场。包含有with语句的代码块的执行过程如下:
1、计算表达式的值,返回一个上下文管理器对象。
2、加载上下文管理器对象的__exit__()方法以备后用。
3、调用上下文管理器对象的__enter__()方法。
4、如果with语句中设置了目标对象,则将__enter__()方法的返回值赋值给目标对象。
5、执行with中的代码块。
6、如果步骤5中代码正常结束,调用上下文管理器对象的__exit__()方法,其返回值直接忽略。
7、如果步骤5中代码执行过程中发生异常,调用上下文管理器对象的__exit__()方法,并将异常类型、值及traceback信息作为参数传递给__exit__()方法。如果__exit__()返回值为false,则异常会被重新抛出;如果其返回值为true,异常被挂起,程序继续执行。
上下文管理器对象:
它定义程序运行时需要建立的上下文,处理程序的进入和退出,实现了上下文管理协议,即在对象中定义__enter__()和__exit__()方法。
上下文管理器主要作用于资源共享,因此在实际应用中__enter__()和__exit__()方法基本用于资源分配以及释放相关的工作,如打开/关闭文件、异常处理、断开流的连接、锁分配等。
网友评论