为什么Python的临时文件方法unlink()需要文件名?

时间:2015-01-21 12:31:35

标签: python temporary-files unlink

Python的tempfile.unlink()需要一个参数,即要取消链接的实体的名称。由于这是对象/类已知的,并且该方法在tempfile中没有记录,恕我直言,它似乎应该只使用它自己的文件名来取消链接。

允许一个对象上的unlink方法删除任意文件似乎很奇怪。

还是有其他用例我错过了吗?

Quantum@Mechanic:/tmp$ python
Python 2.7.3 (default, Apr 10 2013, 06:20:15) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> x = tempfile.NamedTemporaryFile(delete=False)
>>> x.name
'/tmp/tmp_It8iM'
>>> x.close()
>>> x.unlink()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: remove() takes exactly 1 argument (0 given)
>>> x.unlink(x.name)
>>>

深入研究源代码:

import os as _os
unlink = _os.unlink

1 个答案:

答案 0 :(得分:5)

您发现的是实施意外。没有记录NamedTemporaryFile.unlink方法,但正如您所见,似乎确实存在。具体来说它与os.unlink相同,你永远不应该自己调用它,因为它是一个没有文档记录(错误)的功能。

如果你想看到实现,它实际上有关于unlink()方法存在的原因的评论(但不完全是为什么它必须有这个令人困惑的名字),请参见:https://github.com/python-git/python/blob/master/Lib/tempfile.py#L387

# NT provides delete-on-close as a primitive, so we don't need
# the wrapper to do anything special.  We still use it so that
# file.name is useful (i.e. not "(fdopen)") with NamedTemporaryFile.
if _os.name != 'nt':
    # Cache the unlinker so we don't get spurious errors at
    # shutdown when the module-level "os" is None'd out.  Note
    # that this must be referenced as self.unlink, because the
    # name TemporaryFileWrapper may also get None'd out before
    # __del__ is called.
    unlink = _os.unlink

如果您要删除使用tempfile.NamedTemporaryFile(delete=False)创建的内容,请按以下方式删除:

x.close()
os.unlink(x.name)

这可以避免取决于将来可能会改变的实施细节。