_在这种情况下做什么。 (Python / Django)

时间:2020-09-13 20:46:17

标签: python-3.x django

过去30分钟,我一直在绞尽脑汁,试图在声明文件名之前找出以下代码中的下划线和逗号是什么:

def list_entries():
"""
Returns a list of all names of encyclopedia entries.
"""
_,filenames = default_storage.listdir("entries")

return list(sorted(re.sub(r"\.md$", "", filename)
            for filename in filenames if (filename.endswith(".md") and filename != ("EntryNotFound.md"))))

我知道下划线可以用作一次性变量或存储最后一个调用的变量。但是我看不到这里有什么道理。

3 个答案:

答案 0 :(得分:0)

这里使用序列拆包来抓取第二个项目,同时“扔掉”第一个。它基本上等同于:

stuff = default_storage.listdir("entries")
filenames = stuff[1]
del stuff  # This could be omitted

之所以使用下划线,是因为必须有一些内容才能通过拆包来命名第二个元素,但是不需要解包的第一个值。

答案 1 :(得分:0)

os.listdirDjango storage's listdir returns a tuple不同,其第一项是目录列表,而第二项是文件列表。正如您所提到的,下划线在这里被用作一次性变量。

答案 2 :(得分:0)

这是一个用于iterable unpacking [PEP-3132]的一次性变量。如果listdir函数返回带有两个元素的Iterable,则第一个将分配给_变量,第二个将分配给filenames。此类可迭代对象的示例包括2元组,具有两个项目的列表,具有两个字符的字符串等。

在这种情况下,.listdir(…) method [Django-doc]返回一个2元组:

listdir(path)

列出指定路径的内容,返回一个 2元组 列表;第一项是目录,第二项是目录 文件。对于无法提供此类存储的存储系统 列表中,则会引发一个NotImplementedError

因此,这意味着我们将2元组解压缩,将目录列表分配给_变量,并将文件列表分配给filenames变量。