假设我有以下代码:
with open('somefile.txt') as my_file:
# some processing
my_file.close()
my_file.close()
上面是多余的吗?
答案 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__()
方法将关闭文件