我有以下功能,
def load():
with open(PATH_CONFIG, 'r') as file:
return json.loads(file.read())
是否会调用file.close()
?我知道with
关键字通常在缩进块的末尾调用文件的close()
方法,但同时return
关键字意味着函数的其余部分执行不跑。
答案 0 :(得分:3)
就像try
/ finally
,任何退出with
区块return
,break
/ {{1影响围绕它的循环,抛出异常,调用continue
等)将执行适当的清理作为sys.exit
块之外的执行气泡。
唯一的例外是:
with
),解释器本身会崩溃或以其他方式退出"强制" (例如由于段错)os._exit
会绕过所有清理程序(这就是除了分叉工作进程之外不应该使用它的原因)答案 1 :(得分:0)
返回像普通的dedent一样退出with block
答案 2 :(得分:0)
是
如果引发异常,上下文管理器可以选择改变它的行为,但是在返回和从语句体末端掉落之间没有区别,并且除了少数例外,大多数上下文管理器将执行他们的清理并允许异常传播。
这个想法是它与finally
语句相当,并且无论块如何退出都将被执行。标准库中的contextmanager
类使这个类比具体化。
from contextlib import contextmanager
@contextmanager
def example():
print('enter')
try:
yield
print('unexceptional return')
finally:
print('exit')
我们可以通过各种方式使用with example():
来查看with语句在一个更明显的示例中的执行情况,而不是关闭文件。