首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将python " with“语句与try-except块一起使用

将python " with“语句与try-except块一起使用
EN

Stack Overflow用户
提问于 2010-09-04 19:35:29
回答 4查看 87.2K关注 0票数 109

这是将python " with“语句与try-except块结合使用的正确方式吗?:

代码语言:javascript
复制
try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

如果是,那么考虑一下旧的做事方式:

代码语言:javascript
复制
try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

这里"with“语句的主要好处是我们可以去掉三行代码吗?对于我来说,对于这个用例,似乎并不那么令人信服(尽管我知道"with“语句还有其他用法)。

编辑:上面两段代码的功能是否相同?

EDIT2:前几个答案大体上谈到了使用"with“的好处,但在这里这些好处似乎是微不足道的。多年来,我们都(或者应该)显式地调用f.close()。我认为一个好处是草率的程序员将受益于使用"with“。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-09-05 09:20:19

  1. 您给出的两个代码块
  2. 您所描述的旧的处理方式的代码有一个严重的错误:如果打开文件失败,您将在finally子句中得到第二个异常,因为f未绑定。

< code >G29

等效的旧样式代码为:

代码语言:javascript
复制
try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

正如您所看到的,with语句可以减少出错的可能性。在较新版本的Python (2.7,3.1)中,您还可以在一条with语句中组合多个表达式。例如:

代码语言:javascript
复制
with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

除此之外,我个人认为尽早捕捉任何异常都是一种坏习惯。这不是异常的目的。如果可能失败的IO功能是更复杂操作的一部分,在大多数情况下,IOError应该中止整个操作,因此应在外部级别进行处理。使用with语句,您可以在内部级别消除所有这些try...finally语句。

票数 152
EN

Stack Overflow用户

发布于 2010-09-04 19:53:56

如果finally块的内容是由正在打开的文件对象的属性决定的,为什么文件对象的实现者不应该是写finally块的那个人呢?这就是with语句的好处,比在这个特定实例中节省三行代码要多得多。

是的,组合withtry-except的方式几乎是唯一的方法,因为在open语句本身中导致的异常错误在with块中是无法捕获的。

票数 7
EN

Stack Overflow用户

发布于 2010-09-04 19:55:03

我想你把"with“这句话搞错了,它只会减少行数。它实际上执行初始化和处理teardown。

在你的例子中,"with“就是

  • 打开一个文件,
  • 处理其内容,
  • 确保将其关闭。

下面是理解"with“语句的链接:http://effbot.org/zone/python-with-statement.htm

编辑:是的,您对"with“的使用是正确的,并且两个代码块的功能是相同的。关于为什么要使用"with“的问题?这是因为你能从中得到好处。就像你提到的意外遗漏了f.close()。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3642080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档