Python基础:24with语句
一:with语句
在Python 2.6 中正式引入的with语句,是用来简化代码的。这与用try-except 和try-finally所想达到的目的前后呼应。try-except 和try-finally 的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据,日志,数据库等等),线程资源,简单同步,数据库连接,等等。 with 语句的目标就是应用在这种场景。
with 语句的目的在于从流程图中把 try,except 和finally关键字和资源分配释放相关代码统统去掉。 with 语法的基本用法如下:
with context_expr [as var]:
with_suite
虽看起来如此简单,但是其背后还有一些工作要做。不能对Python 的任意符号都使用with 语句。它仅能工作于支持上下文管理协议(context management protocol)的对象。这意味着只有内建了"上下文管理"的对象可以和with 一起工作。目前已经有了一些支持该协议的对象,比如:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
file与with 一起使用的代码如下例:
with open('/etc/passwd', 'r') as f:
for eachLine in f:
# ...do stuff with eachLine or f...
这个代码片段,会完成准备工作,比如试图打开一个文件,如果一切正常,把文件对象赋值给f。然后用迭代器遍历文件中的每一行,当完成时,关闭文件。无论在这一段代码的开始,中间,还是结束时发生异常,都会执行清理的代码,文件会被自动的关闭。
二:上下文管理协议
上下文管理协议:包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。
1:上下文表达式(context_expr),上下文管理器
当with 语句执行时,便执行上下文表达式(就是with 与as 之间的内容)来获得一个上下文管理器。上下文管理器的职责是提供一个上下文对象。这是通过调用__context__()方法来实现的。该方法返回一个上下文对象,用于在with 语句块中处理细节。
上下文管理器是支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
2:上下文对象,with 语句块
一旦获得了上下文对象,就会调用它的__enter()__方法。它将完成with 语句块执行前的所有准备工作。with 行的语法中有一个可选的as 声明变量跟随在context_expr之后。如果提供提供了变量,则以__enter()__返回的内容来赋值;否则,丢弃返回值。
现在,执行了with 语句块。当with 语句块执行结束,无论是正常的,还是由于异常,都会调用上下文对象的__exit()__方法。__exit__()有三个参数。如果with 语句块正常结束,三个参数全部是None。如果发生异常,三个参数的值的分别等于调用sys.exc_info()函数返回的三个值:类型(异常类),值(异常实例),和回溯(traceback)。
可以自己决定如何在__exit__()里面处理异常。如果处理完异常时,__exit__返回False,这会使异常重新抛出。
如果没有发生异常或你在处理异常后返回True,程序会继续执行with 子句后的下一段代码。
因为上下文管理器主要作用于共享资源,因此__enter()__和__exit()__方法基本是做分配和释放资源的低层次工作。比如:数据库连接,锁分配,信号量加减,状态管理,打开/关闭文件,异常处理,等等。
contextlib模块可以帮助你编写对象的上下文管理器,有一个, 包含了实用的functions/decorators, 你可以用在你的函数/ 对象上而不用去操心关于类或__context__(),__enter()__,__enter()__,__exit()__这些方法的实现。
Python基础:24with语句的更多相关文章
- python基础—条件语句
一.Python基础 1.第一句python print('hello,world') Q: 后缀名可以任意? A: 导入模块时,如果不是.py后缀,会出错. 2.两种执行的方式: -python解 ...
- Python基础之语句1
一.行定义(两类): 1.物理行:程序员编写代码的行. 2.逻辑行:python解释器需要执行的指令. 建议:一个逻辑行在一个物理行上,若一个物理行使用多个逻辑行,需要使用分号隔开:如果逻辑行过长,可 ...
- python基础之语句字符串
python的种类: jpython java写的python ironpython c#写的python cpython ...
- python基础-循环语句(5)
一.循环语句介绍 一般情况下,需要多次重复执行的代码,都可以用循环的方式来完成 循环不是必须要使用的,但是为了提高代码的重复使用率,所以有经验的开发者都会采用循环 二.常见的循环形式 while循环 ...
- python基础-条件语句if
if语句: if 判断条件: 执行语句 else: 执行语句 flag = Falsename = 'huipaodexiong'if name == 'python': flag = True ...
- python基础之语句结束
1 2 3 4 5 if a : if b: # 这里是if b的作用区间 #这里是if a的作用区间 #这里不在if 区间 python 是按缩进来识别代码块的.
- Python基础之语句2
一.if条件语句 1.语法: 2.if语句的真值表达式和条件表达式: 例题1:真值表达式判断奇偶数 num = int(input('请输入一个整数:')) if num % 2 : print('该 ...
- python基础,if语句,while循环
if语句: ①2选一 ④多选一 if: 条件 ...
- python基础-循环语句for\嵌套循环
for循环格式: for index in range(0,3):#等同于range(3),取0\1\2 print(index) index = 0 starnames = ['xr1','xr2' ...
- python基础-循环语句while
循环语句:while\for\嵌套 循环控制语句:break\continue break:跳出整个循环,不会再继续循环下去 continue:跳出本次循环,继续下一次循环 while循环: coun ...
随机推荐
- JEECMS二次开发 -------标签使用说明
转载:https://blog.csdn.net/u012176984/article/details/45501771 一:标签套用结构说明 登录后台管理页面,这些嵌套在html中的标签 以[@标签 ...
- Oracle中函数如何返回结果集
在Oracle中,用函数返回结果集有时候要用到,下面是demo: 1 2 3 4 5 6 7 create or replace type t_test as object ( id integer, ...
- OSI层次关系
一.OSI参考模型 今天我们先学习一下以太网最基本也是重要的知识——OSI参考模型. 1.OSI的来源 OSI(Open System Interconnect),即开 ...
- 外观模式(Facade)(门面模式、子系统容易使用)
外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式.该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低 ...
- Redis 复制、Sentinel的搭建和原理说明(转)
Redis 复制.Sentinel的搭建和原理说明 转自:http://www.cnblogs.com/zhoujinyi/p/5570024.html. 背景: Redis-Sentinel是Re ...
- leetcode 21-30 easy
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- 清除SQL数据库文本字段中的回车、换行符的方法
清除SQL数据库中文本字段的回车.换行符的方法 清除回车符: update tableName set columnName = rtrim(ltrim(replace(columnName ,cha ...
- temp for @青
4层方法 IBaseController BaseControllerImpl IBaseService BaseServiceImpl IBaseComponent IBaseCompone ...
- PHPCMS网站迁移过程后,添加内容 报500错误解决方案
问题出现原因:1.网站迁移过程中,上传下载文件时文件丢失 2.PHPCMS源码更新升级 解决方法 1.可以到官方下载最新版源码,替换过去.如果对源码有改动,需要先保存改动过的文件,替换过去之后,再替 ...
- 51nod1196 字符串的数量
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求:(1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以接 ...