Betrachten Sie das folgende:Python eval (Kompilieren (...), Sandbox), Globals gehen in Sandbox, außer in def, warum?
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
ich nicht einmal sicher bin, wie zu fragen, aber ich möchte den globalen Rahmen für eine Funktion, die Umwelt ich es in die Absicht zu sein, zu laufen, ohne die Funktion während der kompilieren zu müssen Eval. Ist das möglich?
Vielen Dank für jede Eingabe
Lösung
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
Was wollen Sie tun, und in welcher Weise sie sich von einer Klasse und eine Methode? Machen Sie eine Methode einer Klasse "test" und verwenden Sie den Namespace 'self'. Inwiefern funktioniert das nicht für dich? –
Das Einzige, was ich tun möchte, ist tiefer in die inneren Abläufe von Python einzutauchen, aus meinem persönlichen Interesse, die Sprache in der Tiefe zu erforschen. Wie die meisten Dinge ergibt sich diese Frage aus einem Problem der realen Welt, aber eines, das ich bereits gelöst habe. Das ist einfach das Streben nach Wissen. –