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

Ответы на вопрос(0)

Ваш ответ на вопрос