使用Python的"with"语句与try-except块

14 浏览
0 Comments

使用Python的"with"语句与try-except块

这是在Python的“with”语句和try-except块中正确使用的方式吗?:

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

如果是的话,那么考虑旧的做法:

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

这里“with”语句的主要好处是我们可以摆脱三行代码吗?对于这个用例来说,它似乎对我来说不是很强大(尽管我知道“with”语句还有其他用途)。

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

编辑2:前几个答案基本上讨论了使用“with”的好处,但这些好处在这里似乎边际效益不大。多年来,我们所有人(或者应该所有人)都明确地调用f.close()。我想一个好处就是邋遢的程序员将受益于使用“with”。

admin 更改状态以发布 2023年5月22日
0
0 Comments

如果finally块的内容是由打开的文件对象的属性确定的,那么为什么不应该是文件对象的实现者编写finally块呢?这就是with语句的好处,比在这种特定情况下节省三行代码要多得多。\n\n是的,你把with和try-except结合使用的方式几乎是唯一的方式,因为在open语句本身中引起的异常错误不能在with块中被捕获。

0
0 Comments
  1. 你给出的两个代码块不等价.
  2. 你所描述的旧的做法存在严重的错误: 如果打开文件失败, 食用finally语句将会得到第二个异常,因为f没有绑定.

等价的旧风格代码:

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

可以看出,使用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语句的所有麻烦.

0