对于文件 I/O,目的是什么:
with open
我应该使用它而不是:
f=open('file', 'w')
f.write('foo)'
f.close()
始终使用with statement
.
来自文档:
在处理文件对象时,最好使用with关键字。这样做的好处是文件在其套件完成后正确关闭,即使在途中引发异常也是如此。它也比编写等效
try-finally
块短得多。
如果您不显式关闭文件,则文件对象可能会在内存中徘徊,直到它被垃圾收集,这会隐式调用close()
文件对象。因此,最好使用该with
语句,因为即使发生错误,它也会显式关闭文件。
是的。您应该with
尽可能使用。
这是使用open
作为上下文管理器的返回值。因此,它with
不仅专门用于open
,而且在任何需要对对象进行一些清理的情况下(通常将其放入finally
块中)都应该是首选。在这种情况下:退出上下文时,将.close()
调用文件对象的方法。
上下文管理器“清理”的另一个很好的例子是threading
's Lock
:
lock = Lock()
with lock:
#do thing
#lock is released outside the context
在这种情况下,上下文管理器正在.release()
锁定锁。
任何带有__enter__
and__exit__
方法的东西都可以用作上下文管理器。或者,更好的是,您可以使用装饰 contextlib
来制作上下文管理器。更多在这里。@contextmanager
基本上它试图避免的是:
set things up
try:
do something
finally:
tear things down
但是使用该with
语句,您可以安全地说打开一个文件,一旦您退出该with
语句的范围,该文件就会被关闭。
该with
语句调用__enter__
一个类的函数,它会进行初始设置,并确保它__exit__
在最后调用该函数,从而确保一切都正确关闭。
该with
语句是轻松编写更健壮代码的捷径。这个:
with open('file', 'w') as f:
f.write('foo')
相当于:
try:
f = open('file', 'w')
f.write('foo')
finally:
f.close()