一: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. HTML 语法简要总结

    HTML基本语法 认识网页 网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频以及Flash等. 常见浏览器内核介绍 浏览器是网页运行的平台,常用的浏览器有IE.火 ...

  2. 元素 XXXX 的前缀 "mvc" 未绑定

    这个问题是由于spring-servlet配置不全 在上边部分添加一句 xmlns:mvc="http://www.springframework.org/schema/mvc" ...

  3. 使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决

    应用场景 我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力.在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Red ...

  4. 洛谷 USACO P2207 Photo

    P2207 Photo 题目描述 Framer Jhon 打算给他的N头奶牛照相,( 2 <= N <= 1 000 000 000) . 他们排成一条线,并且依次取1~N作为编号. 每一 ...

  5. Thinkphp 调试方法

    1.入口文件index.php配置APP_DEBUG,能直接发现页面上的错误 define('APP_DEBUG',True); 2.配置页面调试SHOW_PAGE_TRACE,可以在config里面 ...

  6. 跟我一起学extjs5(02--建立project项目)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jfok/article/details/35569057 跟我一起学extjs5(02--建立pro ...

  7. 【水滴石穿】imooc_gp

    这个项目应该是一个标杆项目,看到之前很有几个项目都是按照这个项目的页面摆放顺序来的 不过可以作为自己做项目的一种方式 源码地址为:https://github.com/pgg-pgg/imooc_gp ...

  8. jdbc连接数据库的步骤(转载)

    http://hzy3774.iteye.com/blog/1689525   1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过jav ...

  9. golang进制

  10. 在Struts2里面嵌入Spring

    第一步:在web.xml中增加以下的listener <listener> <listener-class>org.springframework.web.context.Co ...