在Python中使用'with .. as'语句有什么优势?

22
使用以下代码可以创建并写入 "Hello Python!" 到文件 hello.txt:
with open("hello.txt", "wb") as f:
    f.write("Hello Python!\n")

似乎与以下代码相同:

f = open("hello.txt", "wb")
f.write("Hello Python!\n")
f.close()

使用open .. as相比于f = 的优势是什么? 这只是一种语法糖吗?仅仅是为了省略一行代码吗?


1
http://effbot.org/zone/python-with-statement.htm - Manos Dilaverakis
在http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization上阅读更多关于RAII的有用信息。 - wescpy
3个回答

34

为了与with语句版本等效,您编写的代码应该如下所示:

f = open("hello.txt", "wb")
try:
    f.write("Hello Python!\n")
finally:
    f.close()

虽然这看起来像是语法糖,但它确保释放资源。通常情况下,世界比这些刻意的示例更加复杂,如果你忘记了try.. except...或者没有处理极端情况,你将会有资源泄漏的问题。

with 语句可以避免这些泄漏,使编写干净的代码更容易。要获得完整的解释,请查看PEP 343,其中有很多示例。


13
如果f.write抛出异常,则使用with时会调用f.close(),而在第二种情况下不会被调用。此外,使用with时,f的作用域更小,代码更加清晰简洁。

3

如果在f.write()期间发生异常,前者仍然会关闭f


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接