Использование exec () / compile () с пользовательским вводом - PullRequest
0 голосов
/ 02 октября 2018

Если бы я использовал compile() и exec() для выполнения некоторого кода, введенного пользователем, могут ли функции или переменные, определенные в коде, быть снова использованы за пределами?
Например:

code = ""
while 1:
    line = input("")
    if line == "":
        break
    code += line

exec(compile(code, "code", "exec"))
print(test()+1)

Это не вернет 6, как я ожидал.Это дает NameError, но нет проблем с компиляцией или выполнением кода.Нет ошибки, если код является просто строкой, а не вводом.Есть ли способ использовать функцию test()?

1 Ответ

0 голосов
/ 02 октября 2018

Разрешение имени переменной и область видимости выполняются во время компиляции, поэтому, если имя переменной / функции определяется во время выполнения с помощью exec, вам нужно будет использовать диктовку locals() для ссылки на нее:

exec(compile(code, "code", "exec"))
print(locals()['test']()+1)
...