场景:简化try-except-finally,从流程图中把try, except和finally处理资源分配、释放的相关代码去掉,比如处理文件(数据、日志、数据库等)、线程资源、简单同步、数据库连接等。只适合工作于支持『上下文管理协议』的对象,所以只有内建了『上下文管理』的对象可以和with一起工作。
支持上下文管理协议的对象有:file, decimal.Context, thread.LockType, threading.Lock,threading.RLock, threading.Condition等,最常用的应该是file。
举个栗子:
with open('/home/work/myfile.txt', 'r') as f:
for line in f:
print line
打开文件,如果一切正常,把文件对象赋值给f,然后迭代输出文件中的每一行,当完成时,关闭文件。如果开始/中间/结束发生任何异常,会执行清理代码,文件会自动关闭。