如果使用`with`语句打开文件,则调用`close()`冗余

时间:2017-07-12 05:59:46

标签: python

假设我有以下代码:

with open('somefile.txt') as my_file:
    # some processing
    my_file.close()

my_file.close()上面是多余的吗?

4 个答案:

答案 0 :(得分:2)

是。退出with块将关闭该文件。

但是,对于非文件的对象,情况不一定如此。通常,退出上下文应触发概念上等同于" close"的操作,但事实上__exit__可以重载以执行对象所希望的任何代码。

答案 1 :(得分:1)

with语句创建运行时上下文.Python创建file的流对象,并告诉它正在进入运行时上下文。当with代码块完成时,Python告诉流对象它正在退出运行时上下文,并且流对象调用它自己的close()方法。

答案 2 :(得分:1)

是的;此外,您的close()将始终执行并不保证。 (例如,如果发生Exception)。

with open('somefile.txt') as my_file:
    1/0 # raise Exception
    my_file.close() # Your close() call is never going to be called

with语句的__exit__()函数始终执行,因为它遵循try...except...finally模式。

  

with语句用于包装块的执行   由上下文管理器定义的方法(请参阅With Statement部分   上下文管理器)。这允许常见的尝试......除了...最终用法   要封装的模式以便于重用。

     

调用上下文管理器的__exit __()方法。如果是例外   导致套件退出,其类型,价值和追溯是   作为参数传递给__exit __()

您可以使用with

检查文件是否在closed语句后立即关闭
>>> with open('somefile.txt') as f:
...     pass
>>> f.closed
# True

我的答案来源:

答案 3 :(得分:0)

是的,with语句负责

正如您在documentation中看到的那样:

  

调用上下文管理器的__exit__()方法。如果异常导致退出套件,则其类型,值和回溯作为参数传递给__exit__()

对于文件,__exit__()方法将关闭文件