mis*_*ded 9 python file with-statement contextmanager
我已经读过使用以下格式打开文件时
with open(filename) as f:
#My Code
f.close()
Run Code Online (Sandbox Code Playgroud)
不需要显式关闭文件.有人可以解释为什么会这样吗?此外,如果有人明确关闭文件,它会有任何不良影响吗?
aba*_*ert 18
英里高概述是这样的:当您离开嵌套块时,Python会自动f.close()
为您调用.
是否只是从底部掉下来,或者叫break
/ continue
/ return
跳出来,或者提出异常并不重要; 不管你怎么离开那个街区.它总是知道你要离开,所以它总是关闭文件.*
一级下来,您可以将其视为映射到try:
/ finally:
语句:
f = open(filename)
try:
# My Code
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
一级下来:它如何知道打电话close
而不是一些不同的东西?
嗯,事实并非如此.它实际上调用特殊方法__enter__
和__exit__
:
f = open()
f.__enter__()
try:
# My Code
finally:
f.__exit__()
Run Code Online (Sandbox Code Playgroud)
并且open
(file
Python 2中的一个,io
Python 3中的一个包装器)返回的对象中包含这样的内容:
def __exit__(self):
self.close()
Run Code Online (Sandbox Code Playgroud)
它实际上比上一版本复杂一点,这使得生成更好的错误消息变得更容易,并且让Python避免"进入"一个它不知道如何"退出"的块.
要了解所有细节,请阅读PEP 343.
此外,如果有人明确关闭文件,它会有任何不良影响吗?
一般来说,这是一件坏事.
但是,文件对象会尽力使其安全.对封闭文件执行任何操作都是错误的 - 除了close
它再次.
*除非您离开,例如,在执行脚本的过程中拉动服务器上的电源线.在这种情况下,显然,它永远不会运行任何代码,更不用说了close
.但明确的close
说法几乎无法帮助你.
归档时间: |
|
查看次数: |
19544 次 |
最近记录: |