python 上下文管理协议,
本文主要介绍Python中with的功能和用法。with是Python2.5引入的新语法,它是一个上下文管理协议。以下详细内容,可以参考需要的朋友。
00-1010 1、简介2、try… except语句(1)try…except的标准格式(2)程序执行流程(3)异常分类3、try…finally语句4、with…as语句(1)with语句的基本语法(2)with语句的原理
目录
With是Python2.5引入的新语法。它是一个上下文管理协议。其目的是将try的所有关键字,except和finally以及资源分配和释放的相关代码从流程图中删除,简化try … except … finally的处理流程。
让我们首先理解try…except…finally语句的作用。其实try…except语句和try…finally语句是两种语句,用在不同的场景。然而,当两者结合在一起时,可以实现稳定性和灵活性更好的设计。
1、简介
它用于处理程序执行过程中的异常,如语法错误、从未定义的变量中取值等。也就是一些python程序本身导致的异常和错误。try… except语句是为了防止一些错误影响你的程序继续运行,所以尽量捕捉它们(捕获它们)。
2、try… except语句
尝试:
##普通块
除了A:
##除了一块
例外:
##排除其他块
else:
(1)try…except的标准格式
执行普通程序块。
如果发现错误,执行exc A块(即处理异常)
结束
如果没有错误呢?
执行普通程序块。
查找B错误,开始查找匹配B的异常处理方法,查找A,跳过,查找除其他(except:),执行除其他块。
结束
如果没有错误呢?
执行普通程序块。
整个过程没有错误,跳转到else执行no error块。
结束
(2)程序执行流程
Except后面可以跟一个表达式!所谓的表达是错误的定义。也就是说,我们可以捕捉一些我们想捕捉的异常。而不是报告所有的异常。
异常分两类:
Python标准异常自定义异常(a)Python标准异常
Python标准异常包括NameError(未声明/初始化的对象,无属性),MemoryError内存溢出错误等。
详细python标准异常详见:
异常名称描述基础异常
所有异常的基类
例:
try:a = 1 / 2
print(a)
print(m) # 此处抛出python标准异常
b = 1 / 0 # 此后的语句不执行
print(b)
c = 2 / 1
print(c)
except NameError:
print("Ops!!")
except ZeroDivisionError:
print("Wrong math!!")
except:
print("Error")
输出:
3、try…finallly语句
try…finallly
语句用于无论执行过程中有没有异常,都要执行清场工作。
格式:
try:execution block ##正常执行模块
except A:
exc A block ##发生A错误时执行
except B:
exc B block ##发生B错误时执行
except:
other block ##发生除了A,B错误以外的其他错误时执行
else:
if no exception, jump to here ##没有错误时执行
finally:
final block ##总是执行
tips: 注意顺序不能乱,否则会有语法错误。如果用else就必须有except,否则会有语法错误。
例:
try:a = 1 / 2
print(a)
print(m) # 抛出NameError异常
b = 1 / 0
print(b)
c = 2 / 1
print(c)
except NameError:
print("Ops!!") # 捕获到异常
except ZeroDivisionError:
print("Wrong math!!")
except:
print("Error")
else:
print("No error! yeah!")
finally: # 是否异常都执行该代码块
print("finally!")
输出:
4、with…as语句
(1)With语句的基本语法
with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。其中__enter__()方法在语句体(with语句包裹起来的代码块)执行之前进入运行,__exit__()方法在语句体执行完毕退出后运行。
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的清理操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
With语句的基本语法格式:
with expression [as target]:with-block
expression
:是一个需要执行的表达式;target
:是一个变量或者元组,存储的是expression
表达式执行返回的结果,可选参数。
(2)with语句原理
- 上下文管理协议(Context Management Protocol):包含方法 __enter__()和__exit__(),支持该协议的对象要实现这两个方法。
- 上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。
例:执行过程
with EXPR as VAR:BLOCK
(1)执行EXPR,生成上下文管理器context_manager
;
(2)获取上下文管理器的__exit()__方法,并保存起来用于之后的调用;
(3)调用上下文管理器的__enter__()方法;如果使用了as子句,则将__enter__()方法的返回值赋值给as子句中的VAR;
(4)执行BLOCK中的表达式;
(5)不管是否执行过程中是否发生了异常,执行上下文管理器的__exit__()
方法,__exit__()方法负责执行清理工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句break/continue/return,则以None作为参数调用__exit__(None, None, None);如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__
(exc_type, exc_value, exc_traceback);
(6)出现异常时,如果__exit__
(type, value, traceback)返回False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这也是通用做法;如果返回True,则忽略异常,不再对异常进行处理。
这个和try finally函数有什么关系呢?其实,这样的过程等价于:
try:
执行 __enter__的内容
执行 with_block.
finally:
执行 __exit__内容
例:
class Sample(object):def __init__(self):
print("__init__")
def __enter__(self):
print("__enter__")
def __exit__(self, types, values, trace):
print("type:", types)
print("value:", values)
print("trace:", trace)
def get_sample():
return Sample()
if __name__ == __main__:
# get_data()
with get_sample() as sample:
print("Sample:", sample)
输出:
到此这篇关于Python中with上下文管理协议的作用及用法的文章就介绍到这了,更多相关Python中with用法内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。