程序应如何生成唯一的文件系统路径,不创建 文件系统条目?
tempfile.mktemp
函数是strongly deprecated,这是正确的,因为它使程序容易受到不安全文件创建的影响。
在某些代码(例如单元测试)中,我正在调用tempfile.mktemp
为我不想要的文件系统条目生成唯一路径
存在于真实的文件系统中。在这种情况下文件系统安全性
担忧是无关紧要的,因为没有文件。
该功能的弃用仍然是一个问题,因为我没有 想要使每个尽责的读者都需要决定是否需要的代码 代码是个问题。相反,代码应该避免正确弃用 的API。
该API函数也很容易在某个时刻消失 未来,因为它被明确地强烈弃用。
tempfile
提供的其他功能根本不需要避免触及文件系统,只是为了获得一条独特的路径。
所以我同意tempfile.mktemp
一般的弃用,但图书馆似乎没有为此目的提供替代。
我应该使用什么标准库函数来生成
tempfile.mktemp
- 与唯一路径一样,不创建真实文件
通过那条路?
答案 0 :(得分:2)
AFAIK没有这样的标准功能,它会生成一个唯一的名称,但不会创建文件。 看看" mktemp"的内部实现。功能并创建自己的...
以下是您可能感兴趣的代码:
class _RandomNameSequence:
"""An instance of _RandomNameSequence generates an endless
sequence of unpredictable strings which can safely be incorporated
into file names. Each string is six characters long. Multiple
threads can safely use the same instance at the same time.
_RandomNameSequence is an iterator."""
characters = "abcdefghijklmnopqrstuvwxyz0123456789_"
@property
def rng(self):
cur_pid = _os.getpid()
if cur_pid != getattr(self, '_rng_pid', None):
self._rng = _Random()
self._rng_pid = cur_pid
return self._rng
def __iter__(self):
return self
def __next__(self):
c = self.characters
choose = self.rng.choice
letters = [choose(c) for dummy in range(8)]
return ''.join(letters)
答案 1 :(得分:1)
这是一个代码维护问题,与编程问题一样多。这是解决它的一个选项:
tempfile.mktemp
创建一个包装函数,其中包含与您的域匹配的描述性名称(例如,create_database_path_name
的内容)tempfile.mktemp
调用之上写一条评论,解释为什么它被仔细权衡,并认为这种用法是安全的,尽管有弃用。第一步确保不推荐使用的函数只包含在一个地方。第二步确保将一个地方记录在案以供将来的代码审查。
如果已弃用的功能从模块中消失,则只有一个地方需要修复,例如通过复制原始实现。
答案 2 :(得分:0)
// webpack.config.js
resolve: {
root: '/absolute/path/to/root' // usually just __dirname
},
弃用的原因与您无关,因为您不打算制作该文件。它会生成随机文件名,这就是你想要的。如果您担心那些不了解的评论者,可以做一个简单的评论。或者,您可以创建自己的文件名,例如mktemp
,而不是冒犯他们敏感的感觉。