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 ...
随机推荐
- beego 批量删除问题
o := orm.NewOrm() qs := o.QueryTable(new(ExecutionJobs)) javaTimestamp = 1557738394000 qs = ...
- java并发系列(二)-----线程之间的协作(wait、notify、join、CountDownLatch、CyclicBarrier)
在java中,线程之间的切换是由操作系统说了算的,操作系统会给每个线程分配一个时间片,在时间片到期之后,线程让出cpu资源,由其他线程一起抢夺,那么如果开发想自己去在一定程度上(因为没办法100%控制 ...
- LINNX联网配置文件
联网 /etc/gated.conf gated 的配置.只能被 gated 守护进程所使用. /etc/gated.version 包含 gated 守护进程的版本号. /etc/gateway 由 ...
- 模拟4题解 T3奇袭
T3奇袭 题目描述 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上 要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭了,靠原本 ...
- SpringMVC代码复制版
Lib目录 Java目录 HelloController文件代码 import org.springframework.web.servlet.ModelAndView; import org.spr ...
- cmake时选择的VS生成器
运行cmake --help 在得到的输出中可以得到下面的结果:
- Linux常用命令6 压缩解压命令
.zip是Linux和Windows共有的压缩格式 1.压缩解压命令:gzip 命令英文原意:GNU zip 命令所在路径:/bin/gzip 执行权限:所有用户 语法: gzip [文件] ...
- IE8下图片无法显示问题
一.背景图片不能显示的原因 代码: background:url(img/img1.jpg)no-repeat; background:url(img/img1.jpg) no-repeat; 第一个 ...
- 足迹地图 搜索jvectormap
https://blog.wangjunfeng.com/foot_print/
- op应用:官方,wifidog,portal,uci,luci,脚本,框架,usb
http://wiki.openwrt.org/doc/starthttp://downloads.openwrt.org/docs/buildroot-documentation.htmlhttp: ...