使用python“with”语句和try-except块

这是正确的方式来使用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”语句的主要好处是我们可以摆脱三行代码? 这个用例对我来说似乎并不令人信服(尽pipe我明白“with”语句有其他用途)。

编辑:上述两个代码块的function是否相同?

编辑2:前几个答案一般谈到使用“与”的好处,但在这里似乎边际利益。 我们已经(或应该已经)明确地调用f.close()多年了。 我想一个好处是,马虎编码器将受益于使用“与”。

  1. 你给的两个代码块是相同的
  2. 你所描述的代码的代码有一个严重的错误:如果打开文件失败,你将在finally子句中得到第二个exception,因为f没有绑定。

等效的旧式代码将是:

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

正如你所看到的, with语句可以使事情变得不那么容易出错。 在较新版本的Python(2.7,3.1)中,还可以将多个expression式with语句组合在一起。 例如:

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

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

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

是的,你已经结合并try-except是这样做的唯一方法,因为在open语句本身引起的exception错误不能在with块中捕获。

我认为你错误地认为它只会减less线条。 它实际上是做初始化和处理拆解。

在你的情况下,“与”呢

  • 打开一个文件,
  • 处理它的内容,
  • 确保closures它。

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

编辑:是的,你使用“与”是正确的,两个代码块的function是相同的。 关于为什么要使用“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()