Хотя это информативно, это не касается темы под рукой. Мне не нужен был урок относительно предостережений / неуверенности Eval. Здесь уже есть много других вопросов по stackoverflow, которые охватывают эту тему.
е следующее:
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