英里高概述是这样的:当您离开嵌套块时,Python会自动为您调用f.close().
你是否只是从底部掉下来,或者叫断/继续/返回跳出它,或者引发异常并不重要;不管你怎么离开那个街区.它总是知道你要离开,所以它总是关闭文件.*
一级下来,您可以将其视为映射到try:/ finally:语句:
f = open(filename)
try:
# My Code
finally:
f.close()
一级下来:如何知道呼叫关闭而不是一些不同的东西?
嗯,事实并非如此.它实际上调用特殊方法__enter__和__exit__:
f = open()
f.__enter__()
try:
# My Code
finally:
f.__exit__()
open返回的对象(Python 2中的文件,Python 3中io中的一个包装器)就像这样:
def __exit__(self):
self.close()
它实际上比上一版本复杂一点,这使得生成更好的错误消息变得更容易,并且让Python避免“进入”一个它不知道如何“退出”的块.
要了解所有细节,请阅读PEP 343.
Also if someone does explicitly close the file, will it have any undesirable effect ?
一般来说,这是一件坏事.
但是,文件对象会尽力使其安全.对已关闭的文件执行任何操作都是错误的 – 除了再次关闭它.
*除非您离开,例如,在执行脚本的过程中拉动服务器上的电源线.在这种情况下,显然,它永远不会运行任何代码,更不用说关闭了.但明确的关闭对你来说几乎没有帮助.