繁体   English   中英

使用带有try-except块的python“with”语句

[英]Using python “with” statement with try-except block

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

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

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

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

这里“with”语句的主要好处是我们可以摆脱三行代码吗? 对于这个用例来说,这似乎并不令我感到高兴(尽管我理解“with”语句还有其他用途)。

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

EDIT2:前几个答案一般性地讨论了使用“with”的好处,但这些似乎是边际效益。 我们已经(或应该已经)多年来明确地调用f.close()。 我想一个好处是,草率的编码员将从使用“with”中受益。

  1. 您提供的两个代码块并不等效
  2. 您描述为旧的处理方式的代码存在严重错误:如果打开文件失败,您将在finally子句中获得第二个异常,因为f未绑定。

等效的旧样式代码是:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

正如您所看到的, with语句可以减少错误。 在Python(2.7,3.1)的新版本,你也可以在一个组合多个表达式with语句。 例如:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

除此之外,我个人认为尽早发现任何例外都是不好的习惯。 这不是例外的目的。 如果可能失败的IO函数是更复杂操作的一部分,则在大多数情况下IOError应该中止整个操作,因此在外层处理。 使用with语句,你可以在内层删除所有这些try...finally语句。

如果finally块的内容是由打开的文件对象的属性决定的,那么为什么文件对象的实现者不应该是编写finally块的实现者呢? 这是 with语句的好处,远不止在这个特定实例中保存三行代码。

是的,你结合withtry-except方式几乎是唯一的方法,因为在open语句中引起的异常错误不能在with块中捕获。

我认为你对“with”声明说错了它只会减少线条。 它实际上做了初始化和处理拆解。

在你的情况下“与”做

  • 打开一个文件,
  • 处理它的内容,和
  • 一定要关闭它。

以下是理解“with”声明的链接: http//effbot.org/zone/python-with-statement.htm

编辑:是的,您对“with”的使用是正确的,两个代码块的功能是相同的。 关于为何使用“with”的问题? 这是因为你得到的好处。 就像你提到的意外丢失了f.close()。

以下代码的Pythonic方式更多:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

try:
    f = open("file", "r")
except IOError:
    <whatever>
else:
    f.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM