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 に答える