python的with用法

Python中with语句的用法详解 通过使用with语句,可以确保资源在使用完毕后被正确地释放,同时也使代码更加清晰和易读。这里的expression是一个返回上下文管理器对象的表达式,target是可选的,用于将上下文管理器的返回值绑定到一个变量。with_suite是一个包含在with语句块中的代码块,它定义了在资源被使用时需要执行的操作。在Python中,with语句是一种用于管理资源的语法结构。通过使用with语句,可以确保资源在使用完毕后被正确地释放,无论是否发生异常。在with语句块中,可以调用对象的方法来进行相应的操作。 阅读详情

1.With语句是什么?

有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

如果不用with语句,代码如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这里有两个问题:

一是可能忘记关闭文件句柄; 
二是文件读取数据发生异常,没有进行任何处理。

下面是处理异常的加强版本:

try:
    f = open('xxx')
except:
    print 'fail to open'
    exit(-1)
try:
    do something
except:
    do something
finally:
     f.close()
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

虽然这段代码运行良好,但是太冗长了。

这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。

下面是with版本的代码:

with open("/tmp/foo.txt") as file:
    data = file.read()
 
  • 1
  • 2
  • 1
  • 2

2.with如何工作?

紧跟with后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给as后面的变量。 
当with后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__()方法。

下面例子可以具体说明with如何工作:

#!/usr/bin/env python
# with_example01.py
class Sample:
    def __enter__(self):
        print "In __enter__()"
        return "Foo"
    def __exit__(self, type, value, trace):
        print "In __exit__()"
def get_sample():
    return Sample()
with get_sample() as sample:
    print "sample:", sample
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行代码,输出如下

bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
In __exit__()
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

正如你看到的: 1. __enter__()方法被执行 2. __enter__()方法返回的值 - 这个例子中是”Foo”,赋值给变量’sample’ 3. 执行代码块,打印变量”sample”的值为 “Foo” 4. __exit__()方法被调用 
with真正强大之处是它可以处理异常。可能你已经注意到Sample类的 __exit__ 方法有三个参数 val, type 和 trace。 这些参数在异常处理中相当有用。我们来改一下代码,看看具体如何工作的。

#!/usr/bin/env python
# with_example02.py
class Sample:
    def __enter__(self):
        return self
    def __exit__(self, type, value, trace):
        print "type:", type
        print "value:", value
        print "trace:", trace
    def do_something(self):
        bar = 1/0
        return bar + 10
with Sample() as sample:
    sample.do_something()
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这个例子中,with后面的get_sample()变成了Sample()。这没有任何关系,只要紧跟with后面的语句所返回的对象有 __enter__() 和 __exit__() 方法即可。此例中,Sample()的 __enter__() 方法返回新创建的Sample对象,并赋值给变量sample。

代码执行后:

bash-3.2$ ./with_example02.py
type: <type 'exceptions.ZeroDivisionError'>
value: integer division or modulo by zero
trace: <traceback object at 0x1004a8128>
Traceback (most recent call last):
  File "./with_example02.py", line 19, in <module>
    sample.do_something()
  File "./with_example02.py", line 15, in do_something
    bar = 1/0
ZeroDivisionError: integer division or modulo by zero
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

实际上,在with后面的代码块抛出任何异常时,__exit__() 方法被执行。正如例子所示,异常抛出时,与之关联的type,value和stack trace传给 __exit__() 方法,因此抛出的ZeroDivisionError异常被打印出来了。开发库时,清理资源,关闭文件等等操作,都可以放在 __exit__ 方法当中。

另外,__exit__ 除了用于tear things down,还可以进行异常的监控和处理,注意后几个参数。要跳过一个异常,只需要返回该函数True即可。

下面的样例代码跳过了所有的TypeError,而让其他异常正常抛出。

def __exit__(self, type, value, traceback):
    return isinstance(value, TypeError)
 
  • 1
  • 2
  • 1
  • 2

上文说了 __exit__ 函数可以进行部分异常的处理,如果我们不在这个函数中处理异常,他会正常抛出,这时候我们可以这样写(python 2.7及以上版本,之前的版本参考使用contextlib.nested这个库函数):

try:
    with open( "a.txt" ) as f :
        do something
except xxxError:
    do something about exception
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

总之,with-as表达式极大的简化了每次写finally的工作,这对保持代码的优雅性是有极大帮助的。

如果有多个项,我们可以这么写:

with open("x.txt") as f1, open('xxx.txt') as f2:
    do something with f1,f2
 
  • 1
  • 2
  • 1
  • 2

因此,Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

3.相关术语

要使用 with 语句,首先要明白上下文管理器这一概念。有了上下文管理器,with 语句才能工作。 
下面是一组与上下文管理器和with 语句有关的概念。 
上下文管理协议(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。 
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。 
运行时上下文(runtime context):由上下文管理器创建,通过上下文管理器的 __enter__() 和__exit__() 方法实现,__enter__() 方法在语句体执行之前进入运行时上下文,__exit__() 在语句体执行完后从运行时上下文退出。with 语句支持运行时上下文这一概念。 
上下文表达式(Context Expression):with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。 

语句体(with-body):with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__() 方法,执行完语句体之后会执行__exit__() 方法。


相关链接: 
1.http://blog.kissdata.com/2014/05/23/python-with.html 
2.https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/

【雕爷学编程】MicroPython手册之控制流语句 with...as 资源块语句 在这个示例中,with…1、MicroPython的控制流语句与Python的控制流语句基本相同,只是在一些细节上有所区别,如MicroPython不支持match语句,而Python 3.10及以上版本支持。5、用continue语句可以跳过当前循环的剩余部分,直接进入下一次循环,如在遍历一个列表时跳过某些不符合要求的元素,或者在计算一个数的因数时跳过偶数等。2、用for语句可以遍历一个序列或迭代器中的每个元素,并对每个元素进行相应的操作,如打印列表中的每个元素,或者计算字符串中的每个字符出现的次数等。 阅读详情

相关推荐

【雕爷学编程】MicroPython手册之文件操作模块 open

由于文件以写入模式打开,如果文件已存在,写入操作将覆盖文件的内容。文件的模式可以是r(只读)、w(写入)、a(追加)、x(创建)、r+(读写)、w+(写入并读取)、a+(追加并读取)或者x+(创建并读取)。修改文件:可以使用open函数来打开一个已存在的文件,然后使用seek和tell方法来定位到指定的位置,然后使用write方法来修改内容。它返回的文件对象有一些方法和属性,如read()、write()、seek()、tell()、close()等方法,以及name、mode、closed等属性。

雕爷学编程 364

【Python】with关键字详解

学习目标 能够说出使用with的好处 能够自定义复合with规范的上下文管理类 1. 使用with的作用 (方式一) 1.1 文件操作中的with 回想一下文件操作,一般文件操作都会面临你一个问题:由于读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确的关闭文件,我们先使用try… finally来实现 使用try … finally:使用这种方式,无论如何最后文件都会关闭,解决了上述问题,但是代码比较繁琐,我们思考有没有简单的方式 try

weixin_44441131的博客 2万+

【环境搭建】使用openSfM+MVSNet重建稠密点云

本帖详细介绍了如何使用openSfM+MVSNet对真实采集的数据进行稀疏重建与稠密重建,并针对一些真实场景下可能遇到的问题进行了整理。

YuhsiHu的博客 1971

python中with关键字详解

对with关键字的理解

bradyM的博客 4万+

从SN65HVD230芯片手册出发,手把手教你搞定3.3V CAN收发器电路(附典型应用图)

本文详细解析TI SN65HVD230芯片手册,指导完成3.3V CAN收发器电路设计。从关键参数解读到基础电路搭建,再到高级功能实现与EMC优化,提供完整的接口电路设计方案,并附典型应用图和故障排查指南,助力开发者提升CAN总线通信质量。

weixin_29997523的博客 506

单细胞空间转录组分析流程学习python版(三)

空转python版学习

zfyyzhys的博客 2085

Python中with的用法

Python中with的用法

叶强的博客 601

【原创】SAP/Oracle 集团企业海外全球化实施注意事项: 一带一路本地化 (持续更新)...

ABC集团SAP的系统平台已经扩展到全球一百来个国家和地区,SAP系统平台的全球实施项目中, 当时是需要支持当地的业务和法律法规的合规要求。   当时客户也是缺乏当地的资源以及对当地法律法规和业务实践的了解,需要团队提供了全球化的支持,通过我们全球产品技术专家充分传递了各区域的本地化支持和实践 而且近年来我们发现一些国家和政府,陆续都在推出一些新的税改和合规的要求,接下来基于这些要求,我们全球...

weixin_34024034的博客 1143

with所有用法python_python的with用法(转载)

weixin_33045057的博客 142

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

新手必看!手把手教你在群晖 NAS 上玩转 Docker 容器(Container Manager)!(群晖 NAS 如何创建 Docker 容器以及 Compose 部署项目)

XiaoqiangClub的博客 5161

解锁机器人动态平衡算法:从原理到实践

机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3838

python with 用法_Python with的用法

在Python中,with关键字是一个替你管理实现上下文协议对象的好东西。例如:file等。示例如下:from __future__ import with_statementwith open('cardlog.txt','r') as item :for line in item :print line;在file的结束,会自动关闭该文件句柄。在python2.6中,with正式成为了关键字所...

weixin_40007548的博客 205

使用Qt和MX Component插件实现与菱PLC的通信

在本文中,我们介绍了如何使用Qt和MX Component插件实现与菱PLC的通信。我们首先安装和配置了MX Component插件,并在Qt项目中初始化和使用MX Component来连接、读取和写入PLC的数据。安装完成后,您需要在Qt项目中配置MX Component的路径,以便Qt可以找到所需的库文件。在本文中,我们将探讨如何使用Qt和MX Component插件来实现与菱PLC的通信。在主函数中,我们将初始化MX Component,并创建一个与PLC通信的示例。在上面的代码中,我们使用了。

TlScratch的博客 996

python with as区别和用法_python with as 的用法

with语句:不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放。比如文件处理,需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄不用with语句,代码如下:file = open("/tmp/foo.txt")data=file.read()file.close()这里有两个问题。一是忘记关闭文件句柄;二是文件读取数据发生异常,没进行任何处理。下面是处...

weixin_39629876的博客 408

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

Soly_kun的博客 414

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python里with as_python with as用法

with as用途:取代原来的try...finally,主要是用于处理异常基本语法;with EXPRESSION [ as VARIABLE] WITH-BLOCK基本要求:with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的...

weixin_39962770的博客 406

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

python with as 用法_python with as 的用法

with语句:不管是否发生异常都会指执行必要的清理操作,比如文件的自动关闭以及线程中锁的自动获取与释放。比如文件处理,需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄不用with语句,代码如下:file = open("/tmp/foo.txt")data=file.read()file.close()这里有两个问题。一是忘记关闭文件句柄;二是文件读取数据发生异常,没进行任何处理。下面是处...

weixin_39981624的博客 127

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

说说Python中with的用法?

公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助!...

867

python中with...as的用法

python中with...as的用法_琪琪的博客-优快云博客

phymat.nico的专栏 941

python中with as的用法_python with as的用法

With语句是什么?有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。如果不用with语句,代码如下:file = open("/tmp/foo.txt")data = file.read()file.close()这里有两个问题。一是可能忘记关闭...

weixin_35799770的博客 200

Python中的with...as用法

一、为什么要有with … as在 Python 里,任何需要“打开 → 使用 → 关闭/释放”的资源(文件、网络连接、数据库会话、锁等)都必须,否则就会:文件句柄泄漏锁死线程数据库连接池耗尽传统写法必须手写,既啰嗦又容易忘。with … as把这些繁琐的“收尾工作”了。二、最简语法骨架withasas可省略)<表达式>必须返回一个(见下文)。<变量>接收上下文管理器执行后返回的值。代码块无论还是,都会自动执行__exit__()做清理。

liangliang9027的博客 1061

python中with的作用_Python中with及contextlib的用法详解

本文实例讲述了Python中with及contextlib的用法。分享给大家供大家参考,具体如下:平常Coding过程中,经常使用到的with场景是(打开文件进行文件处理,然后隐式地执行了文件句柄的关闭,同样适合socket之类的,这些类都提供了对with的支持):with file('test.py','r') as f :print f.readline()with的作用,类似try...fi...

weixin_28909295的博客 356

Python 中,with open()的各种用法详解~

语句是处理文件的标准方式,它能自动管理文件的打开和关闭,避免资源泄漏。合理选择文件打开模式能避免多数错误,结合异常处理可进一步增强代码健壮性。在 Python 中,

york0609的博客 1704
上一篇: spyder导入tensorflow包
下一篇: 文章标题
Kola_Abner
博客等级 码龄14年 27粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值