一: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语句的更多相关文章

  1. python基础—条件语句

    一.Python基础 1.第一句python print('hello,world') Q: 后缀名可以任意? A:  导入模块时,如果不是.py后缀,会出错. 2.两种执行的方式: -python解 ...

  2. Python基础之语句1

    一.行定义(两类): 1.物理行:程序员编写代码的行. 2.逻辑行:python解释器需要执行的指令. 建议:一个逻辑行在一个物理行上,若一个物理行使用多个逻辑行,需要使用分号隔开:如果逻辑行过长,可 ...

  3. python基础之语句字符串

    python的种类: jpython                 java写的python ironpython            c#写的python cpython             ...

  4. python基础-循环语句(5)

    一.循环语句介绍 一般情况下,需要多次重复执行的代码,都可以用循环的方式来完成 循环不是必须要使用的,但是为了提高代码的重复使用率,所以有经验的开发者都会采用循环 二.常见的循环形式 while循环 ...

  5. python基础-条件语句if

    if语句: if 判断条件: 执行语句 else: 执行语句 flag = Falsename = 'huipaodexiong'if name == 'python':    flag = True ...

  6. python基础之语句结束

    1 2 3 4 5 if a :     if b:          # 这里是if b的作用区间     #这里是if a的作用区间 #这里不在if 区间 python 是按缩进来识别代码块的.

  7. Python基础之语句2

    一.if条件语句 1.语法: 2.if语句的真值表达式和条件表达式: 例题1:真值表达式判断奇偶数 num = int(input('请输入一个整数:')) if num % 2 : print('该 ...

  8. python基础,if语句,while循环

    if语句: ①2选一                                              ④多选一 if:     条件                              ...

  9. python基础-循环语句for\嵌套循环

    for循环格式: for index in range(0,3):#等同于range(3),取0\1\2 print(index) index = 0 starnames = ['xr1','xr2' ...

  10. python基础-循环语句while

    循环语句:while\for\嵌套 循环控制语句:break\continue break:跳出整个循环,不会再继续循环下去 continue:跳出本次循环,继续下一次循环 while循环: coun ...

随机推荐

  1. Eclipse luna安装 Ivy

    在线安装地址:http://www.apache.org/dist/ant/ivyde/updatesite

  2. hdu 4722 Good Numbers( 数位dp入门)

    Good Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  3. C++ UNREFERENCED_PARAMETER函数的作用

    新建win32 application程序,会有这样一段代码 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hP ...

  4. Django框架Day3------之Models

    一.Django models字段类型清单: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需要直接使用这个字段:如果你不指定主键的话,系统会自动添加一个主键字段到你的m ...

  5. 阿里云ecs环境配置

    在阿里云 CentOS 服务器(ECS)上搭建 nginx + mysql + php-fpm 环境 https://ninghao.net/blog/1368 阿里云ecs从购买到环境搭建和建站!! ...

  6. golang之数据结构

    4种:bool/int/uint/uintptr(其中bool类型的零值为false,其余类型的零值为0) 4种:float32/float64/complex64/complex126 (零值为0) ...

  7. liferay 7用OSGi的方式修改默认权限

    事先声明,支持这一功能的新版本还没有发布,2017年5月份才支持的 1.以前在62的时候是通过修改ext项目进行修改 2.现在在70可以通过Module Fragment项目进行修改 相关文件:现在出 ...

  8. php的模板原理

    下载了开源论坛phpbb的代码,突然对php模板初步了解了一下: php与Html在一起编写真的是很烦人,所以必须要把数据计算以及显示格式分离,这就需要模板来实现了. http://baike.bai ...

  9. Nginx教程(一) Nginx入门教程 (转)

    1 Nginx入门教程 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行.由俄罗斯的程序设计师IgorSysoev所开 ...

  10. Directx11教程(57) 环境映射

    原文:Directx11教程(57) 环境映射       建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...