我是Python的新手,我对从shutil模块处理下面提到的代码片段有些怀疑。
def ignore_patterns(*patterns):
"""Function that can be used as copytree() ignore parameter.
Patterns is a sequence of glob-style patterns
that are used to exclude files"""
def _ignore_patterns(path, names):
ignored_names = []
for pattern in patterns:
ignored_names.extend(fnmatch.filter(names, pattern))
return set(ignored_names)
return _ignore_patterns
当shutil.copytree
选项设置为ignore
时调用ignore_patterns
,然后调用ignore_patterns
函数并返回一个函数。我的怀疑是:
1)ignore_patterns
被调用时将返回_ignore_pattern
函数引用。现在,当调用此函数时,它仍然如何访问“模式”列表?一旦调用函数“ignore_patterns”返回,在调用时创建的列表模式应仅可用于其被调用范围。
2)返回的函数_ignore_patterns
函数名称中下划线的含义是什么?
答案 0 :(得分:4)
这称为closure,它是允许嵌套函数的语言的一般功能。内部函数可以关闭外部作用域中的变量,并且当从外部函数外部调用它们时将保留对该名称的引用。
下划线只是表示_ignore_patterns
是一个内部函数,同时保持返回函数的名称相似。它可以被称为你喜欢的任何东西。
答案 1 :(得分:1)
ignore_patterns
调用后将返回_ignore_pattern
函数引用。现在,当这个函数被调用时,它如何仍然访问"模式"列表。
这很好。 _ignore_pattern
是一个封闭。这意味着它保留了完成其工作所需的所有局部变量(包括函数参数)。最终垃圾收集器会得到它,但不是在它可能仍然需要时。
返回函数_ignore_patterns
函数名称中下划线的含义是什么?
作者只想消除名称的歧义。它击败了封闭f
。这就是我要做的。