过去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"))))
我知道下划线可以用作一次性变量或存储最后一个调用的变量。但是我看不到这里有什么道理。
答案 0 :(得分:0)
这里使用序列拆包来抓取第二个项目,同时“扔掉”第一个。它基本上等同于:
stuff = default_storage.listdir("entries")
filenames = stuff[1]
del stuff # This could be omitted
之所以使用下划线,是因为必须有一些内容才能通过拆包来命名第二个元素,但是不需要解包的第一个值。
答案 1 :(得分:0)
与os.listdir
,Django 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
变量。