1

我是 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,它会调用函数并返回一个函数。我的疑问是:ignoreignore_patternsignore_patterns

1)ignore_patterns调用时将返回_ignore_pattern函数引用。现在当这个函数将被调用时,它如何仍然访问“模式”列表?一旦被调用的函数“ignore_patterns”返回,在其调用中创建的列表模式应该仅可用于其被调用范围。

_ignore_patterns2)返回的函数函数名中下划线的意义是什么?

4

2 回答 2

4

这称为闭包,它是允许嵌套函数的语言的一般特性。内部函数可以关闭外部作用域中的变量,并在从外部函数外部调用它们时保留对该名称的引用。

下划线只是表示这_ignore_patterns是一个内部函数,同时保持返回函数的名称相似。它可以被称为任何你喜欢的东西。

于 2012-08-28T13:43:26.367 回答
1
  • ignore_patterns调用时将返回_ignore_pattern函数引用。现在,当这个函数将被调用时,它仍然是如何访问“模式”列表的。

    这可以。 _ignore_pattern是一个闭包。这意味着它保留了完成工作所需的所有局部变量(包括函数参数)。最终垃圾收集器会得到它,但在可能仍然需要它的时候不会。

  • _ignore_patterns返回函数函数名中下划线的意义是什么?

    作者只是想消除名称的歧义。它胜过调用闭包f。这就是我会做的。

于 2012-08-28T13:44:35.813 回答