考虑以下内容: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
某种方式绕过 上下文管理器 ?
是的。更一般地, __exit__
如果 上下文中出现 from ,With 语句上下文管理器 return
的方法
class MyResource:
def __enter__(self):
print('Entering context.')
return self
def __exit__(self, *exc):
print('EXITING context.')
def fun():
with MyResource():
print('Returning inside with-statement.')
return
print('Returning outside with-statement.')
fun()
输出为:
Entering context.
Returning inside with-statement.
EXITING context.
上面的输出确认 __exit__
尽管很早之前就调用了 return
。因此,上下文管理器没有被绕过。