上下文管理器
Python 的 with
语句支持通过上下文管理器所定义的运行时上下文这一概念。 此对象的实现使用了一对专门方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文。
上下文管理器对象
实现了上下文协议的对象,成为上下文管理器对象,该协议要求对象实现__enter__
方法和与之对应的__exit__
方法。
_enter_()
进入运行时上下文并返回此对象或关联到该运行时上下文的其他对象。 此方法的返回值会绑定到使用此上下文管理器的 with
语句的 as
子句中的标识符。
最常见的是我们对锁和文件的操作,他们支持我们使用上下文协议来访问。
# open() 将文件转化为文件管理器对象,此时文件对象将会作为__enter__ 方法的返回 给 as 后的 `f`。
# 在 __exit__ 方法中,自动的执行了 f.close() 方法,为我们关闭了文件。
with open('file.txt', 'r', encoding='utf-8') as f:
data = f.read()
# 在此需要对异常进行处理,必须要保证无论发生什么情况,文件总是要被顺利的释放 也就是执行 f.close()
# 这要在__exit__中实现。
_exit_(exc_type, exc_val, exc_tb)
exc_type
错误类型
exc_val
错误值
exc_tb
回溯信息
return
返回一个布尔值, True 表示已经完美处理,False 出了问题
当无问题发生时, 返回 True。如果
在其他情况下三个参数均为 None
。自此方法返回一个真值将导致 with
语句屏蔽异常并继续执行紧随在 with
语句之后的语句。 否则异常将在此方法结束执行后继续传播。
在此方法执行期间发生的异常将会取代 with
语句的语句体中发生的任何异常。传入的异常绝对不应当被显式地重新引发 —— 相反地,此方法应当返回一个假值以表明方法已成功完成并且不希望屏蔽被引发的异常。 这允许上下文管理代码方便地检测 __exit__()
方法是否确实已失败。
例子
class Ghost(object):
""""""
def __init__(self, host):
self.host = host
def __enter__(self):
print('Create a temporary backup file.')
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> bool:
"""
exc_type: 错误类型
exc_val: 错误值
exc_tb: 回溯信息
return: 返回一个布尔值, True 表示已经完美处理,False 出了问题
"""
print('Clean up temporary backup files.')
return True # 不应该简单粗暴的返回 True!!! 要依据 参数来确定是 True 或 False
# 这样写 将不会理会with 内的语句成功与否 Python 都会认为一切 OK 实际开发中这是要命的!
def get_ghost(self):
print('Storage ghost %s'. % self.host)
ghost = Ghost('Master')
with ghost as f:
f.get_ghost()
# Create a temporary backup file.
# Storage ghost Master.
# Clean up temporary backup files.