1

我正在开发一个支持头像的 django 项目,系统(这不是最好的,但需要维护)要求我们在用户生成的头像文件中嵌入格式为 YYYYMMDDHHMM 的时间戳,并将其与 user_id 连接起来,例如例子:

23_201308080930.png

我编写了一个函数来解析这些文件名并返回最新的时间戳:

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    user_id = self.user_id
    file_re = re.escape(str(user_id)) + r"_\d{12}.png"
    times = []
    [times.append(file) for file in os.listdir(path) if re.match(file_re, file)]
    if times:
        digits = [re.findall("\d{12}", timestamp) for timestamp in times]
        timestamp = sorted(digits, reverse=True)[0][0]
        return timestamp

它工作正常,但是遍历由顺序正则表达式返回的列表中的列表所需的双 [0][0] 弹出有点令人反感,总体而言,这一切似乎有点生硬。此外,尽管虚拟形象实际上分布在许多目录中(由 user_id 自动生成,但这在这里并不重要),但我觉得如果目录非常大,暴力正则表达式搜索可能会影响性能。

我很想知道这个问题的最佳和惯用的解决方案是什么?它是生成器的候选者还是某种形式的惰性评估?

4

1 回答 1

2

我不会为此使用正则表达式;当你真的不需要它们时,最好避免它们。这是我的做法(未经测试):

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    filenames = [filename for filename in os.listdir(path)
                 if filename.partition('_')[0] == str(self.user_id)]
    filenames.sort(reverse=True)
    return (filenames[0].rpartition('_')[2].partition('.')[0]
            if filenames else None)
于 2013-08-08T08:50:26.873 回答