Python3中with⽤法
Python中的with语句⽤于⽤上下⽂管理器(context manager)定义的⽅法包装块的执⾏,它允许将常见的try…except…finally使⽤模式封装起来以⽅便重⽤。
在Python中,在处理⾮托管资源(unmanaged resources)(如⽂件流)时使⽤with关键字。它允许确保你在使⽤资源的代码完成运⾏时”清理”资源,即使抛出异常也是如此。它为try/finally块提供”语法糖”(syntactic sugar)。
with语句适⽤于对资源进⾏访问的场合,确保不管使⽤过程中是否发⽣异常都会执⾏必要的”清理”操作,释放资源,⽐如⽂件使⽤后⾃动关闭、线程中锁的⾃动获取和释放等。
要在⽤户定义的对象中使⽤with语句,你只需在对象⽅法中添加__enter__()和__exit__()⽅法。
with语法:
with EXPRESSION [as TARGET]:
SUITE
with语句执⾏过程如下:
(1).评估上下⽂表达式以获得上下⽂管理器;
(2).上下⽂管理器的__enter__()被加载以备后⽤;
(3).上下⽂管理器的__exit__()被加载以备后⽤;
(4).上下⽂管理器的__enter__()⽅法被调⽤;
(5).如果TARGET包含在with语句中,则将__enter__()的返回值赋值给它。with语句保证如果__enter__()⽅法没有错误返回,那么__exit__()将始终被调⽤。因此,如果在赋值给TARGET列表的过程中发⽣错误,它将被视为SUITE中发⽣的错误。__enter__()⽅法是可以带返回值的,默认返回None。
(6).SUITE被执⾏;
(7).上下⽂管理器的__exit__()⽅法被调⽤。如果异常导致SUITE退出,则其类型、值和回溯(traceback)将作为参数传递给__exit__();否则,传递3个None。__exit__()⽅法也是可以带返回值的,这个返回值应该是⼀个布尔类型True或False,默认为None(即False)。如果为False,异常会被抛出,⽤户需要进⾏异常处理。如果为True,则表⽰忽略该异常。
如果SUITE因异常退出,并且__exit__()⽅法返回的值为False,则触发异常。如果返回值为True,则异常被抑制,并继续执⾏with语句之后的语句。
如果SUITE因异常以外的任何原因退出,则__exit__()的返回值将被忽略,并在所采取的退出类型的正常位置继续执⾏。
以下为测试代码:
class FileWriter(object):
def __init__(self, file_name):
print("run __init__")
self.file_name = file_name
def __enter__(self):
print("run __enter__")
self.file = open(self.file_name, 'w')
return self.file
def __exit__(self, type, value, traceback):
print("run __exit__")
print("type:", type); print("value:", value); print("traceback:", traceback)
self.file.close()
print("test FileWriter:")
with FileWriter('') as f:
print("start write")
f.write('hello world')
print("end write")
class ExceptionTest(object):
def __enter__(self):
print("run __enter__")
return self
def __exit__(self, type, value, traceback):
print("run __exit__")
print("type:", type); print("value:", value); print("traceback:", traceback)
return False # return True # 注意返回True和False的区别:返回True则跳过异常,继续执⾏with语句之后的语句
def divide_by_0(self):
v = 10/0
print("\ntest ExceptionTest")
python的try和except用法with ExceptionTest() as ex:
ex.divide_by_0()
print("test finish")
执⾏结果如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。