创建一个唯一的文件系统路径,没有任何真正的fi

2024-10-03 17:23:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

tempfile.mktemp函数是strongly deprecated,这是正确的,因为它使程序容易受到不安全文件创建的攻击。你知道吗

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

这个函数的弃用仍然是一个问题,因为我不知道 想要让每一个认真的读者决定 代码是个问题。相反,代码应该避免被正确地弃用 API。你知道吗

它还容易导致API函数在应用程序中的某个点消失 未来,因为它是明确和强烈反对。你知道吗

tempfile提供的其他函数根本不满足避免触及文件系统的需要,而只是为了获得唯一的路径。你知道吗

所以我大体上同意对tempfile.mktemp的反对意见,但是这个库似乎没有为此提供替代品。你知道吗

我应该使用什么标准库函数来生成 tempfile.mktemp-类似于唯一路径,而不是创建真正的文件 在那条路上?你知道吗


Tags: 文件函数代码路径程序api情况条目
3条回答

这既是一个编程问题,也是一个代码维护问题。这里有一个解决方法:

  • tempfile.mktemp周围创建一个包装函数,使用与您的域相匹配的描述性名称(例如create_database_path_name中的某些内容)
  • 在实现中,在tempfile.mktemp调用上方写一条注释,解释为什么它被仔细权衡,并被认为是安全的,尽管有人反对。你知道吗

第一步确保不推荐使用的函数的调用只包含在一个地方。第二步确保有一个地方被很好地文档化,以便将来进行代码评审。你知道吗

如果不推荐使用的函数从模块中消失,则只有一个地方需要修复,例如通过复制原始实现。你知道吗

使用mktemp的原因与您无关,因为您不打算创建该文件。它生成随机文件名,这就是你想要的。如果你担心评论者不明白这一点,一个简单的评论就可以了。或者,您可以使用base64.b64encode(os.urandom(20)).decode('ascii')之类的内容创建自己的文件名,而不会冒犯他们的敏感度。你知道吗

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)

相关问题 更多 >