的描述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__()
在解释器退出时为仍然存在的对象调用方法。 ”所以一切都与到目前为止的文档。
但是,我对此的含义感到困惑。如果不能保证在解释器退出时关闭文件对象,那么即使程序正常退出,成功写入(缓冲的)文件对象的一些数据是否会丢失,因为它仍然在文件对象的缓冲区中,并且文件对象从未关闭?
不知何故,这对我来说似乎不太可能和非 Pythonic,并且 open() 文档也不包含任何此类警告。所以我(暂时)得出结论,文件对象毕竟保证是关闭的。
但是这个魔法是怎么发生的,为什么不能NamedTemporaryFile()
使用同样的魔法来确保文件被删除呢?
编辑:请注意,我在这里不是在谈论文件描述符(由操作系统缓冲并在程序退出时由操作系统关闭),而是关于可能实现自己的缓冲的 Python 文件对象。