我正在开发一个具有头像支持的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
它工作正常,但是在顺序regexen返回的列表中遍历列表所需的double [0] [0] pop有点令人反感,总体而言似乎有点生硬。此外,虽然化身实际上分布在许多目录上(由user_id自动生成,但这在这里并不重要),我觉得如果目录非常大,可能是强力正则表达式搜索可能会影响性能。
我很想知道这个问题的最佳和惯用解决方案是什么?它是生成器的候选者还是某种形式的懒惰评估?
答案 0 :(得分: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)