python with语句
-
with语句的作用
with语句是python引入的一种与异常处理相关的功能,可以看作是try...finally语句的简化.
with语句常用于对资源进行访问的场景,可以确保在对资源操作过程中不管是否发生异常,都能自动地正常释放资源. -
with语句的基本语法
with expression [as variable]:
with-block
"""
expression:返回一个支持上下文管理协议的对象,返回的对象可以在with-block开始前执行初始化程序,在with-block完成后执行终止化程序代码,不论with-block中是否发生异常
variable:variable一般来说被赋值的是expression返回的对象
""" -
上下文管理器
"""
理解with语句,先理解python的上下文管理器.
作为上下文管理器,必须实现两个方法:
__enter__():上文方法,负责进入运行时上下文的准备操作,返回的值可以是上下文管理器对象,也可以是与运行时上下文相关的其他对象,如果with语句有as,会把其返回的值赋值给as后的变量上.
__exit__():下文方法,负责退出运行时上下文的清理操作,返回一个布尔值,这个布尔值标明如果with-block的退出是由异常引发的,该异常是否需要被忽略(返回值为False:这个异常将被重新引发一次;返回值为True:这个异常就会被忽略,继续执行后面的代码)
这两个方法就是上下文管理器协议,实现了这两个方法的对象就是上下文管理器.
""" -
自定义上下文管理器
# python的一些内置工具实现了上下文管理协议,如open(file),threading.Lock,threading.RLock等.
# 还可以自定义上下文管理器
# 自定义上下文管理器类
class File(object):
# 初始化方法
def __init__(self, file_name, file_mode):
# 定义变量保存文件名称和文件的打开模式
self.file_name = file_name
self.file_mode = file_mode
# 上文方法:负责进入语句块的准备操作,返回操作对象资源(如文件对象,数据库连接对象),也可以是其他相关对象
def __enter__(self):
# 返回文件资源
self.file = open(self.file_name, self.file_mode)
return self.file
"""
下文方法:负责离开语句块的清理操作,释放资源,如关闭文件,关闭数据库连接对象
exc_type:异常类型,如果执行无异常,值为None
exc_val:异常值,如果执行无异常,值为None
exc_tb:traecback信息,如果执行无异常,值为None
"""
def __exit__(self, exc_type, exc_val, exc_tb):
print("退出")
# 释放资源
self.file.close()
"""
with语句结合上下文管理器使用
with语句执行流程:
1. 执行File("text1.txt", "r")语句,获取上下文管理器
2. 加载上下文管理器的__exit__()方法等后续调用
3. 调用上下文管理器的__enter__()方法
4. 如果有as关键字,就将__enter__()方法的返回值赋值给as后边的变量
5. 执行子代码块with-block
6. 不管执行子代码块with-block时是否发生异常,都自动执行上下文管理器的__exit__()方法,执行清理操作
6.1 如果执行过程中没有发生异常,则以None为参数调用__exit__(None, None, None)
6.2 如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback)
7. 出现异常时:
7.1 如果__exit__(type, value, traceback) == False:重新抛出异常,让with之外的语句来处理异常
7.2 如果__exit__(type, value, traceback) == True:忽略异常,不再对异常进行处理
"""
with File("text1.txt", "r") as f:
# file_content = f.read()
# print(file_content)
# 因为文件打开方式是只读,写入肯定会发生异常
f.write("aaa")