使用python“ with”语句与try-except块
-
30-09-2019 - |
题
这是将python“与“”语句结合结合使用的正确方法?:
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()
这里的“带有”声明的主要好处是我们可以摆脱三行代码?对我来说似乎并不令人信服 对于此用例 (尽管我知道“带有”语句具有其他用途)。
编辑:上述两个代码相同的功能是否相同?
EDIT2:最初的几个答案通常谈论使用“与”的好处,但是这里似乎有微不足道的好处。多年来,我们已经(或应该一直)明确调用f.close()。我想一个好处是,草率的编码器将受益于“使用”。
解决方案
- 您给出的两个代码块是不是 相等的
- 您描述的代码 旧的做事方式 有一个严重的错误:如果打开文件失败,您将在该文件中获得第二个例外
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
语句,在此特定实例中节省了三行代码。
是的,您合并的方式 with
和 try-except
几乎是唯一的方法,因为在 open
声明本身不能被抓住 with
堵塞。
我认为您对“使用”声明仅降低线条的说法是错误的。它实际上进行了初始化并处理拆解。
在您的情况下,“有”
- 打开文件,
- 处理其内容,并
- 确保关闭它。
这是理解“带”语句的链接: http://effbot.org/zone/python-with-statement.htm
编辑:是的,您对“使用”的用法是正确的,并且两个代码块的功能都是相同的。关于为什么使用“与”的问题?这是因为您得到的好处。就像您提到的关于意外缺少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()