python 中 with 用法
前言
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 用法相关推荐
- 简单介绍Python中异常处理用法
这篇文章主要给大家分享的是 Python中异常处理用法,为了保证程序的健壮性与容错性,即在遇到错误时候程序不会崩溃,我们需要对异常进行处理,下面来看看文章对此的用法,需要的朋友可以参考一下 为了保证程 ...
- python中 的用法_详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,@function作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是函数定义). 代码1 结 ...
- python讲解-详解python中@的用法
python中@的用法 @是一个装饰器,针对函数,起调用传参的作用. 有修饰和被修饰的区别,"@function"作为一个装饰器,用来修饰紧跟着的函数(可以是另一个装饰器,也可以是 ...
- 【 Python 中 int 用法详解】(转载)
Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...
- Python 中 int 用法详解
Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...
- Python中self用法详解
Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...
- python中“end=”用法
python中"end="用法:例如print("#",end=" \n"),默认换行,print("#",end=&q ...
- python中with open用法_在线玩转python中with用法
在本篇文章里小编给大家整理的是关于python中with用法讲解内容,有需要的朋友们可以参考下. 我们都知道打开文件有两种方法:f = open() with open() as f: 这两种方法的区 ...
- python中return用法
python中return用法 python中,在调用函数的时候,为了使得函数返回我们想要的值,就需要python中的return来解决此问题. (1)return语句是python语言中函数返回的一 ...
- Python中f-string用法
Python中f-string用法 单行f 先使用官网以及自己测试的小例子来说明使用方法:代码如下: 使用方法: f'{}' 这种写法比较像java中的el表达式,也是采用了大括号的形式进行读取! c ...
最新文章
- python封装一个效率极高的 批量更新、插入合一的工具
- QTextEdit实现图片和文本同行显示
- asp留言板源码-XYCMS留言板 v8.0
- jquery实现的滚动新闻(多个实例代码)
- Java中使用MongoTemplate写聚合函数样例
- 结队编程思路及感悟(python、tkinter、mysql、腾讯云短信等)
- Visio使用经验汇集
- js 使用Rsa 加密 解密
- jsp管理系统页面模板_Jsp+Ssh2+Mysql实现的CRM客户关系管理系统
- div 垂直居中的六种方法
- 橡胶软接头的安装及使用说明
- 压缩包文件密码如何解密
- 微软bi报表服务器,安装适用于 Power BI 报表服务器的 Power BI Desktop
- linux locale 编译,Linux locale 缺失和安装
- MFC中通过SendMessage修改Edit控件的文本
- AUTOMATE THE BORING STUFF WITH PYTHON读书笔记 - 第19章:MANIPULATING IMAGES
- ASM PCRP21-100-1-SSI-KAB5M
- 2019-5-25-win10-uwp-win2d-入门-看这一篇就够了
- AI人工智能机器人教室方案(含全套配置)
- 如何解决MacOS Big Sur,打印错误:ERROR invalidcontent?