以前に尋ねたこの質問へのフォローアップとして、外部関数のコンテキストにあるかのように Python コードを実行する実験を行っています。これを行うには、単純にコード ブロックを でラップし、def outer():
簡単な文字列処理を行って内部コードを適切にインデントします。次に、それをコンパイルし、リスト内の最初のコード オブジェクトを実行して、コンパイルされた内部コードを実行しますco_consts
。
例:
mycode = """
print("Hey!")
"""
wrapped_code = 'def outer():\n ' + '\n '.join(mycode.strip().split('\n'))
compiled_code = compile(wrapped_code, '<str>', 'exec')
exec(compiled_code.co_consts[0], {}, {})
print("Hey")
これにより、外部関数のコンテキスト内からコードが実行されます。(なぜ私がこれを行っているのか不思議に思っている人がいれば、それは私が取り組んできた C 拡張モジュールの一部です。)
質問: コードを外側の関数でラップしてから内側のコードのブロック、ローカル変数を実行コンテキストに渡すことができないようです。
mycode = """
print(locals())
"""
wrapped_code = 'def outer():\n ' + '\n '.join(mycode.strip().split('\n'))
compiled_code = compile(wrapped_code, '<str>', 'exec')
exec(compiled_code.co_consts[0], {}, {"foo" : "bar"})
これは以下を出力します:
{}
を含むローカル dict を明示的に渡したことに注意してください。ただし{"foo" : "bar"}
、exec
実際にコードを実行して を出力するとlocals()
、空の辞書が表示されます。なぜ Python は、私が渡したローカル変数の辞書を使用しなかったのですか?