从Python中的函数返回函数

时间:2012-08-28 13:38:29

标签: python shutil

我是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函数名称中下划线的含义是什么?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

  • ignore_patterns调用后将返回_ignore_pattern函数引用。现在,当这个函数被调用时,它如何仍然访问"模式"列表。

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

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

    作者只想消除名称的歧义。它击败了封闭f。这就是我要做的。