如果在缩进块中返回一个值,那么`with open ... as file` close file?

时间:2017-02-07 14:51:06

标签: python python-3.x

我有以下功能,

def load():
    with open(PATH_CONFIG, 'r') as file:
        return json.loads(file.read())

是否会调用file.close()?我知道with关键字通常在缩进块的末尾调用文件的close()方法,但同时return关键字意味着函数的其余部分执行不跑。

3 个答案:

答案 0 :(得分:3)

就像try / finally任何退出with区块returnbreak / {{1影响围绕它的循环,抛出异常,调用continue等)将执行适当的清理作为sys.exit块之外的执行气泡。

唯一的例外是:

  1. 当存在实际错误时(在翻译中,或者滥用本身危险的工具,如with),解释器本身会崩溃或以其他方式退出"强制" (例如由于段错)
  2. 调用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语句在一个更明显的示例中的执行情况,而不是关闭文件。