は、次のことを考えてみましょう:Python eval(コンパイル(...)、サンドボックス)、グローバルではdefでない限りサンドボックスに入ります、なぜですか?
def test(s):
globals()['a'] = s
sandbox = {'test': test}
py_str = 'test("Setting A")\nglobals()["b"] = "Setting B"'
eval(compile(py_str, '<string>', 'exec'), sandbox)
'a' in sandbox # returns False, !What I dont want!
'b' in sandbox # returns True, What I want
'a' in globals() # returns True, !What I dont want!
'b' in globals() # returns False, What I want
私は聞いてどのようにしてもわからないんだけど、私は関数のグローバルスコープが中に機能をコンパイルすることなく、私はそれを実行する予定の環境になりたいですeval。これは可能ですか?任意の入力
ソリューション
def test(s):
globals()['a'] = s
sandbox = {}
# create a new version of test() that uses the sandbox for its globals
newtest = type(test)(test.func_code, sandbox, test.func_name, test.func_defaults,
test.func_closure)
# add the sandboxed version of test() to the sandbox
sandbox["test"] = newtest
py_str = 'test("Setting A")\nglobals()["b"] = "Setting B"'
eval(compile(py_str, '<string>', 'exec'), sandbox)
'a' in sandbox # returns True
'b' in sandbox # returns True
'a' in globals() # returns False
'b' in globals() # returns False
何をしたい、とどのようにそれはクラスとメソッドを使用して異なっていますか? 'test'をクラスのメソッドにし、' self'という名前空間を使うようにします。どのようにこれはあなたのために働かないのですか? –
私が探している唯一のことは、言語を深く研究する私の個人的関心から、Pythonの内部の仕組みに深く浸ることです。ほとんどのものと同様、この質問は実際の世界の問題に由来しますが、私はすでに解決しています。これは単に知識の追求です。 –