2

程序应该如何生成唯一的文件系统路径而不创建文件系统条目?

tempfile.mktemp功能已被强烈弃用,这是正确的,因为它使程序容易受到不安全文件创建的影响。

在某些代码(例如单元测试)中,我正在调用为我不想存在于真实文件系统上的tempfile.mktemp文件系统条目生成唯一路径。在这种情况下,文件系统安全问题无关紧要,因为没有文件。

该功能的弃用仍然是一个问题,因为我不希望代码让每个认真的读者都需要确定代码是否有问题。相反,代码应该避免正确弃用的 API。

该 API 函数也很容易在未来某个时候消失,因为它已被明确且强烈地弃用。

提供的其他功能tempfile根本不需要避免接触文件系统,只是为了获得唯一的路径。

所以我同意tempfile.mktemp一般的弃用,但图书馆似乎没有为此目的提供替代品。

我应该使用什么标准库函数来生成 类似tempfile.mktemp的唯一路径,而不是通过该路径创建真实文件?

4

3 回答 3

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)
于 2016-02-14T22:16:46.597 回答
1

这是一个代码维护问题,也是一个编程问题。这是解决它的一种选择:

  • 在 周围创建一个包装函数tempfile.mktemp,其描述性名称与您的域匹配(例如,类似于 的东西create_database_path_name
  • 在实现中,在tempfile.mktemp调用上方写一个注释,解释为什么它被仔细权衡,并认为这种用法是安全的,尽管弃用。

第一步确保已弃用函数的调用仅包含在一个位置。第二步确保一个地方有很好的文档记录以供将来的代码审查。

如果不推荐使用的功能从模块中消失,您只有一个地方可以修复,例如通过复制原始实现。

于 2016-02-14T22:22:10.837 回答
0

弃用的原因mktemp与您无关,因为您不打算制作该文件。它会生成随机文件名,这就是您想要的。如果您担心审稿人不理解这一点,那么简单的评论就可以了。或者,您可以使用类似的名称创建自己的文件名,base64.b64encode(os.urandom(20)).decode('ascii')而不会冒犯他们微妙的感受。

于 2016-02-14T22:32:42.343 回答