理解Python的With语句

发布时间:2026/9/8 16:16:48
理解Python的With语句 理解的With语句有一些任务, 或许事先得进行设置, 事后要开展清理工作, 针对此场景, with语句给出了一种极为便利的处置方式, 一个很棒的例子是文件处理, 需获取一个文件句柄, 从文件里读取数据, 之后关闭文件句柄。要是那样的话, 人们就会按照这样的思路去写: , 和那个一起。如果不用with语句代码如下file open(/tmp/foo.txt) data file.read() file.close()这儿有 two。首先, 你最终要进行关闭文件的操作。问题在于如何处理一旦文件已经被……之后可能出现的情况。一个人可以像这样编写代码来达成这个目的标点。从而得到这样的 标点这句子好难改啊完全词不达意啊 。此处在这方面存在着两个问题, 其一为极有可能出现忘记将文件句柄实施关闭的情况, 其二是当文件读取数据之时发生了异常状况, 并且未曾有过任何的处理举措。接下来呈现的是针对异常进行处理的强化版本:file open(/tmp/foo.txt) try: data file.read() finally: file.close()尽管这段代码运行状况良好, 不过却太过冗长了。就在这个时候, 便是with发挥用处的时候了。它不但有着更为优雅的语法, with还能够对上下文环境引发的异常予以良好的处理。下面呈现的是with版本的代码:with open(/tmp/foo.txt) as file: data file.read()with如何工作如此看上去充斥着魔法, 然而却并非仅仅只是魔法这般简单, 并且针对with的处理十分巧妙, 其根本的思想在于, with所需求取值的对象一定要具备一个enter()方法, 以及一个exit()方法。跟随着 with 之后的语句被求值完毕以后, 返回对象的 enter() 方法会被调用, 此方法的返回值会被赋予 as 后面的变量。在 with 过后的代码块全部被推行告终之后, 会调用先前返回对象的 exit() 方法。This can be with the :下面例子可以具体说明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:, sampleWhen , this will in:运行代码输出如下bash-3.2$ ./with_example01.py In __enter__() sample: Foo In __exit__()As you can see,The enter() isThe exit() is .正如你看到的1. enter()方法被执行2. 在这个例子所涉及的情境里, enter()方法返回的那个值, 也就是“Foo”, 被赋给了变量。3. 执行代码块打印变量””的值为 “Foo”4. exit()方法被调用with的真正强大之处在于它能够处理异常, 或许你已经留意到类的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()怎么在这样的情况里, 对于某个括号及其内容而言, 带有特定条件或行为的它采取某种方式或状态。它并非, 只要某个条件或情况, 即与某个变量或对象相关联到一个具有特定属性或行为如enter()和exit()的对象。在这种情况下, 该括号所关联对象的 enter()致使某个新生成的对象部分发生并且那就是被传送至某个地方或产生某种结果的东西。在这个例子里头, with之后的括弧变为了后一组括弧。这没有丝毫关系, 只要紧贴着where之后所返回的对象具备enter方法和exit方法就行。在这个例子当中, 前方括弧的enter方法返回新创建出来的对象, 而后讲其赋值给变量。When :代码执行后bash-3.2$ ./.pytype:value:orby zerotrace:(most call last):File ./.py,line 19, in.()File ./.py,line 15, inbar 1/0:orby zero实际上, 当在with后面的代码块抛出任意异常之际exit()方法会去执行。如同例子所展示的, 在异常被抛出之时, 跟它相关联的type、value以及stack trace会被传递给exit()方法, 所以被抛出的异常就被打印出来了。在开发库的时候, 诸如清理资源这样子的操作, 还有关闭文件之类的行为, 都能够放置在exit方法里面。因此, 与之相关的是一个很棒的东西, 它能让代码在某种程度上减少一些, 并且能在一定程度上弥补一点。因此, with语句借助一种有效的机制, 使得代码变得更为简练, 并且在异常出现的时候, 能让清理工作变得更加简单。我已经把这里给出的代码放置在了, 放置在了某个地方, 某个地方具体是哪里呢, 不太明确, 总之就是已经放置了。示例代码可以在上面找到译注本文原文见 ’s “With”

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询