このテスト コードではexec
(Python 3.4 を使用):
vals = {}
exec('def fun(): print("Hello from fun")', vals)
exec('def main(): fun()', vals)
vals['main']()
出力は次のとおりです。
楽しみからこんにちは
しかし、これがうまくいくとは思っていませんでした。なぜなら、とが への参照を解決するための共通の名前空間を持たない別のコード片として解釈されるfun
と仮定したからです。main
main
fun
では、 の実行はどのようmain
に への参照を解決できるのfun
でしょうか?
追加ベースの問題の理解。forとprint
を使用すると、2 つの関数が同じグローバルを参照することが明らかになります。id
vals
globals
vals = {}
print('id(vals):', id(vals))
exec('def fun(): print("fun id(globals()):", id(globals())); print("Hello from fun")', vals)
exec('def main(): print("main id(globals()):", id(globals())); fun()', vals)
vals['main']()
これにより、次のことが得られます。
id(値): 32271016
メイン ID (グローバル ()): 32271016
楽しい id (グローバル ()): 32271016
楽しみからこんにちは
したがって、vals
は のコードのグローバルとして使用され、exec
@Dunes やその他のコメントで説明されているように、接続を提供します。ありがとう。