考虑以下内容:with open(path, mode) as f: return [line for line in f if condition] 文件是否会被正确关闭,或者使用 return 是否会以某种方式绕过上下文管理器?
考虑以下:
with open(path, mode) as f:
return [line for line in f if condition]
文件是否会被正确关闭,或者是否以 return
某种方式绕过 上下文管理器 ?
是的,它的作用就像 finally
一个块接着一个 try
块,即它总是执行(当然,除非 python 进程以不寻常的方式终止)。
的一个示例中也提到了这一点, PEP-343 这是该语句的规范 with
:
with locked(myLock):
# Code here executes with myLock held. The lock is
# guaranteed to be released when the block is left (even
# if via return or by an uncaught exception).
然而值得一提的是, open()
如果不将整个 with
块放入块内 try..except
,而这通常不是人们想要的。