前言

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,

比如文件使用后自动关闭/线程中锁的自动获取和释放等。

问题引出

如下代码:

file = open("1.txt")
data = file.read()
file.close()

上面代码存在2个问题:
(1)文件读取发生异常,但没有进行任何处理;
(2)可能忘记关闭文件句柄;

改进

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
try:f = open('xxx')
except:print('fail to open')exit(-1)
try:do something
except:do something
finally:f.close()

虽然这段代码运行良好,但比较冗长。
而使用with的话,能够减少冗长,还能自动处理上下文环境产生的异常。如下面代码:

with open("1.txt") as file:data = file.read()

with 工作原理

(1)紧跟with后面的语句被求值后,返回对象的“–enter–()”方法被调用,这个方法的返回值将被赋值给as后面的变量;
(2)当with后面的代码块全部被执行完之后,将调用前面返回对象的“–exit–()”方法。
with工作原理代码示例:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Sample:def __enter__(self):print "in __enter__"return "Foo"def __exit__(self, exc_type, exc_val, exc_tb):print "in __exit__"
def get_sample():return Sample()
with get_sample() as sample:print "Sample: ", sample

代码的运行结果如下:

in __enter__
Sample:  Foo
in __exit__

可以看到,整个运行过程如下:
(1)enter()方法被执行;
(2)enter()方法的返回值,在这个例子中是”Foo”,赋值给变量sample;
(3)执行代码块,打印sample变量的值为”Foo”;
(4)exit()方法被调用;

【注:】exit()方法中有3个参数, exc_type, exc_val, exc_tb,这些参数在异常处理中相当有用。

  • exc_type: 错误的类型
  • exc_val: 错误类型对应的值
  • exc_tb: 代码中错误发生的位置

示例代码:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Sample():def __enter__(self):print('in enter')return selfdef __exit__(self, exc_type, exc_val, exc_tb):print "type: ", exc_typeprint "val: ", exc_valprint "tb: ", exc_tbdef do_something(self):bar = 1 / 0return bar + 10
with Sample() as sample:sample.do_something()

程序输出结果:

in enter
Traceback (most recent call last):
type:  <type 'exceptions.ZeroDivisionError'>
val:  integer division or modulo by zeroFile "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 36, in <module>
tb:  <traceback object at 0x7f9e13fc6050>sample.do_something()File "/home/user/cltdevelop/Code/TF_Practice_2017_06_06/with_test.py", line 32, in do_somethingbar = 1 / 0
ZeroDivisionError: integer division or modulo by zeroProcess finished with exit code 1

总结

实际上,在with后面的代码块抛出异常时,exit()方法被执行。开发库时,清理资源,关闭文件等操作,都可以放在exit()方法中。
总之,with-as表达式极大的简化了每次写finally的工作,这对代码的优雅性是有极大帮助的。
如果有多项,可以这样写:

With open('1.txt') as f1, open('2.txt') as  f2:do something

python 中 with 用法相关推荐

  1. 简单介绍Python中异常处理用法

    这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...

  2. python中 的用法_详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...

  3. python讲解-详解python中@的用法

    python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,"@function"作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是 ...

  4. 【 Python 中 int 用法详解】(转载)

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  5. Python 中 int 用法详解

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  6. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  7. python中“end=”用法

    python中"end="用法:例如print("#",end=" \n"),默认换行,print("#",end=&q ...

  8. python中with open用法_在线玩转python中with用法

    在本篇文章里小编给大家整理的是关于python中with用法讲解内容,有需要的朋友们可以参考下. 我们都知道打开文件有两种方法:f = open() with open() as f: 这两种方法的区 ...

  9. python中return用法

    python中return用法 python中,在调用函数的时候,为了使得函数返回我们想要的值,就需要python中的return来解决此问题. (1)return语句是python语言中函数返回的一 ...

  10. Python中f-string用法

    Python中f-string用法 单行f 先使用官网以及自己测试的小例子来说明使用方法:代码如下: 使用方法: f'{}' 这种写法比较像java中的el表达式,也是采用了大括号的形式进行读取! c ...

最新文章

  1. python封装一个效率极高的 批量更新、插入合一的工具
  2. QTextEdit实现图片和文本同行显示
  3. asp留言板源码-XYCMS留言板 v8.0
  4. jquery实现的滚动新闻(多个实例代码)
  5. Java中使用MongoTemplate写聚合函数样例
  6. 结队编程思路及感悟(python、tkinter、mysql、腾讯云短信等)
  7. Visio使用经验汇集
  8. js 使用Rsa 加密 解密
  9. jsp管理系统页面模板_Jsp+Ssh2+Mysql实现的CRM客户关系管理系统
  10. div 垂直居中的六种方法
  11. 橡胶软接头的安装及使用说明
  12. 压缩包文件密码如何解密
  13. 微软bi报表服务器,安装适用于 Power BI 报表服务器的 Power BI Desktop
  14. linux locale 编译,Linux locale 缺失和安装
  15. MFC中通过SendMessage修改Edit控件的文本
  16. AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第19章:MANIPULATING IMAGES
  17. ASM PCRP21-100-1-SSI-KAB5M
  18. 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
  19. AI人工智能机器人教室方案(含全套配置)
  20. 如何解决MacOS Big Sur,打印错误:ERROR invalidcontent?

热门文章

  1. 中国十大军校排行榜中国十大军校排行榜:
  2. (2012年旧文)纪念史蒂夫乔布斯---IT界的普罗米修斯
  3. Unity DOTS ECS 0.50版本,海浪Demo
  4. 【Elasticsearch系列】CentOS7安装Elasticsearch
  5. 固态继电器和电磁继电器模块
  6. linux下的彩蛋和各种有趣的命令
  7. DeviceIOControl实战
  8. 数据库系统原理实验一——数据库定义实验
  9. 2020-2021年CFA一二三级/FRM一二级最全备考资料合集
  10. Flowable多实例会签功能来袭