Plus tôt, j'ai écrit sur les fermetures dans Cet article de cas d'utilisation de la définition de fonction imbriquée, mais les noms et les valeurs des variables libres sont pour les objets de fonction. J'ai essayé de savoir comment il est stocké à l'intérieur. (Ci-après, Python 3 est supposé.)
Les variables Python gratuites sont des variables qui sont utilisées dans un bloc de code (pas des variables globales) mais qui ne sont pas définies dans ce bloc et dans [Description](https://docs.python.org/3.6 /reference/executionmodel.html).
Par exemple, dans le code ci-dessous, la variable «y» est utilisée dans une fonction «barre» imbriquée, mais elle est définie à l'intérieur du bloc de définition de la fonction «foo» externe. Ainsi, «y» est une variable locale de la fonction «foo» et une variable libre de la fonction «bar».
python
def foo():
y = "I'm free in bar."
def bar():
print(y)
y = "I'm still free in bar."
return bar
foo
renvoie bar
, donc pour appeler bar
vous avez besoin de deux parenthèses comme ceci:
python
>>> foo()()
I'm still free in bar.
À propos, la valeur de «y» n'est pas l'heure à laquelle «bar» est définie, mais la valeur lorsqu'elle est appelée. Dans l'exemple ci-dessus, «y» est défini deux fois dans «foo», mais vous pouvez voir qu'il s'agit d'une chaîne définie plus tard.
Maintenant, comme pour le sujet principal, du côté de l'objet de la fonction externe foo
, le nom de la variable y
utilisé à partir de la fonction imbriquée est dans le membre co_cellvars
(tuple) de son propre objet de code ( __ code__
). Je suis.
python
>>> foo.__code__.co_cellvars
('y',)
D'un autre côté, du côté de l'objet bar
, y
est nommé comme une variable libre dans le membre co_freevars
de l'objet code. (Le toto () ci-dessous est bar.)
python
>>> foo().__code__.co_freevars
('y',)
Le contenu de la variable libre est contenu dans le tuple de l'attribut «closure» en tant qu'objet «cell», et peut être obtenu comme «cell_contents» comme suit.
python
>>> foo().__closure__[0].cell_contents
"I'm still free in bar."
Recommended Posts