Pythonスコープの内部動作に関する以前の質問に対するいくつかの解決策を検討しているときに、__closure__
属性について学びました。Pythonはこの属性を使用して、ネストされた関数内から外部スコープで定義された変数にアクセスしているようです。
次の手順を実行することで、これが実際に動作していることを確認できます。
def foo():
x = 5
def bar():
print(x)
print(*(cell.cell_contents for cell in bar.__closure__))
bar()
foo()
これは、2つの囲まれた値5
と、関数bar
自体を示しています。
私が理解していないのは、これがどのように機能するかです。属性には、囲まれた値__closure__
を格納するセルのタプルが含まれているだけだからです。ただし、囲まれた変数名に関する情報はありません-(つまり、セルはではなく、に格納されます)。では、Pythonはどのようにして囲まれた変数の名前を知るのでしょうか?tuple
dict