使用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()多年了。 我想一个好处是,马虎编码器将受益于使用“与”。
- 你给的两个代码块是不相同的
- 你所描述的旧代码的代码有一个严重的错误:如果打开文件失败,你将在
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()
- window.location.href,window.location.replace和window.location.assign之间的区别
- 使用GIT,我怎样才能有select地从别人的“fork”中取出/合并更改?