Python Language Fermeture


Exemple

Les fermetures en Python sont créées par des appels de fonction. Ici, l'appel à makeInc crée une liaison pour x référencée à l'intérieur de la fonction inc . Chaque appel à makeInc crée une nouvelle instance de cette fonction, mais chaque instance a un lien vers une liaison différente de x .

def makeInc(x):
  def inc(y):
     # x is "attached" in the definition of inc
     return y + x

  return inc

incOne = makeInc(1)
incFive = makeInc(5)

incOne(5) # returns 6
incFive(5) # returns 10

Notez que bien que dans une fermeture régulière la fonction incluse hérite complètement de toutes les variables de son environnement englobant, dans cette construction, la fonction jointe n'a qu'un accès en lecture aux variables héritées mais ne peut pas leur attribuer

def makeInc(x):
  def inc(y):
     # incrementing x is not allowed
     x += y  
     return x

  return inc

incOne = makeInc(1)
incOne(5) # UnboundLocalError: local variable 'x' referenced before assignment

Python 3 offre l'instruction nonlocal ( variables nonlocal ) pour réaliser une fermeture complète avec des fonctions imbriquées.

Python 3.x 3.0
def makeInc(x):
  def inc(y):
     nonlocal x
     # now assigning a value to x is allowed
     x += y  
     return x

  return inc

incOne = makeInc(1)
incOne(5) # returns 6