2012-08-28 6 views
1

Je suis un débutant à Python, j'ai quelques doutes sur le travail de l'extrait de code mentionné ci-dessous à partir du module shutil.Renvoyer la fonction de la fonction en Python

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 

Lorsqu'un appel à shutil.copytree est faite avec ignore option sur ignore_patterns, il appelle la fonction ignore_patterns et retourne une fonction. Mes doutes sont:

1) ignore_patterns lorsqu'il est appelé renverra la référence de fonction _ignore_pattern. Maintenant, quand cette fonction sera appelée, comment accède-t-elle toujours à la liste "patterns"? Une fois la fonction appelée "ignore_patterns" renvoyée, les modèles de liste créés lors de son appel ne devraient être disponibles que pour sa portée appelée.

2) Quelle est la signification du trait de soulignement dans la fonction retournée _ignore_patterns nom de la fonction?

Répondre

4

Ceci est appelé un closure, et c'est une caractéristique générale des langues qui permettent des fonctions imbriquées. Les fonctions internes peuvent fermer variables dans une étendue externe et conserver une référence à ce nom lorsqu'elles sont appelées depuis l'extérieur de la fonction externe. Le trait de soulignement est juste pour signifier que _ignore_patterns est une fonction interne, tout en gardant le nom de la fonction retournée similaire. Cela pourrait s'appeler quelque chose que vous aimez.

1
  • ignore_patterns quand appelé retournera référence de fonction _ignore_pattern. Maintenant, quand cette fonction sera appelée, comment elle accède toujours à la liste "patterns".

    C'est très bien. _ignore_pattern est une fermeture. Cela signifie qu'il conserve toutes les variables locales (y compris les paramètres de fonction) dont il a besoin pour faire son travail. Éventuellement, le garbage collector l'obtiendra, mais pas tant qu'il sera encore nécessaire.

  • Quelle est la signification du trait de soulignement dans la fonction retournée _ignore_patterns nom de la fonction?

    L'auteur voulait juste désambiguïser les noms. Il bat en appelant la fermeture f. C'est ce que j'aurais fait.

Questions connexes