tempfile.NamedTemporaryFile()
的描述如下:
如果delete为true(默认值),则文件在关闭时立即被删除。
在某些情况下,这意味着文件在Python解释器结束后仍未被删除。例如,在py.test
下运行以下测试时,临时文件仍然存在:
from __future__ import division, print_function, absolute_import
import tempfile
import unittest2 as unittest
class cache_tests(unittest.TestCase):
def setUp(self):
self.dbfile = tempfile.NamedTemporaryFile()
def test_get(self):
self.assertEqual('foo', 'foo')
在某种程度上这是有道理的,因为这个程序从来没有显式地关闭文件对象。对象关闭的另一种方式可能在
__del__
析构函数中,但是在这里,语言参考文献指出:“不能保证解释器退出时仍存在的对象会调用__del__()
方法。”所以到目前为止所有内容都符合文档要求。然而,我对此的影响感到困惑。如果不能保证文件对象在解释器退出时被关闭,那么即使程序正常退出,因为数据仍在文件对象的缓冲区中,并且文件对象永远没有被关闭,那么一些成功写入的数据是否会丢失呢?
在我看来,这似乎非常不可能和不符合 Python 的编码规范,而且 open() 文档也没有包含任何这样的警告。因此我 (暂时) 得出结论,文件对象是被保证关闭的。
但是这个魔法是如何发生的,为什么
NamedTemporaryFile()
不能使用相同的方法来确保文件被删除呢?请注意,我不是在谈论操作系统缓冲并在程序退出时由操作系统关闭的文件描述符,而是关于实现自己的缓冲区的 Python 文件对象。