使用Python的"with"语句与try-except块
使用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日
- 你给出的两个代码块不等价.
- 你所描述的旧的做法存在严重的错误: 如果打开文件失败, 食用
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
语句的所有麻烦.