0

以前に尋ねたこの質問へのフォローアップとして、外部関数のコンテキストにあるかのように 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 は、私が渡したローカル変数の辞書を使用しなかったのですか?

4

1 に答える 1

0

exec の最初のパラメーターとして関数を渡しています。関数は独自のローカルを定義するため、それが出力するローカルです。ラッピングを取り除くと(まったく使用されていません)、機能します。

于 2013-04-01T10:44:16.110 に答える