考虑以下内容: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
某种方式绕过 上下文管理器 ?
是的。
def example(path, mode):
with open(path, mode) as f:
return [line for line in f if condition]
..几乎相当于:
def example(path, mode):
f = open(path, mode)
try:
return [line for line in f if condition]
finally:
f.close()
更准确地说, __exit__
上下文管理器中的方法总是在退出块时被调用(无论异常、返回等)。文件对象的 __exit__
方法只是调用 f.close()
(例如 在 CPython 中 )