exec(object, globals=None, locals=None)
object
- строка кода, либо объект кода,globals
- словарь глобального пространства, относительно которого следует исполнить код,locals
- объект-отображение (например dict
), локальное пространство, в котором следует исполнить код.Функция exec()
поддерживает динамическое выполнение кода Python и принимает большие блоки кода, в отличие от eval()
. Передаваемый функции код должен быть либо строкой, либо объектом кода, например сгенерированный функцией compile()
. Если это строка, строка анализируется как набор операторов Python, который затем выполняется (если не возникает синтаксическая ошибка). Если это объект кода, он просто выполняется. Во всех случаях ожидается, что исполняемый код будет действительным, как ввод файла.
Во всех случаях, если globals
и locals
опущены, код выполняется в текущей области видимости. Если указываются глобальные переменные, это должен быть словарь (а не подкласс словаря), который будет использоваться как для глобальных, так и для локальных переменных. Если передаются локальные переменные, то locals
может быть любым отображающим объектом.
Внимание:
return
и yield
не могут быть использованы вне определений функций, даже в контексте кода, переданного в exec().globals
и locals
- один и тот же словарь. Если функция получит разные объекты в globals
и locals
, код будет исполнен, как если бы он был расположен в объявлении класса.Если словарь globals
не содержит значения для ключа __builtins__
, то передается встроенное builtins
пространство. Таким образом, вы можете контролировать, какие встроенные функции доступны для исполняемого кода, вставляя свой собственный __builtins__
словарь в глобальные переменные перед его передачей exec()
.
globals()
и locals()
возвращают текущий глобальный и локальный словарь, соответственно, которые могут быть полезны для передачи в качестве globals
и locals
аргументов функции exec()
.locals()
. Если требуется влияние кода, исполненного exec() на локальную область, явно передавайте словарь locals
.>>> x = 'name = "John"\nprint(name)'
>>> exec(x)
# John
>>> y = 'print("5 + 10 =", (5+10))'
>>> exec(y)
# 5 + 10 = 15
>>> prog = 'for x in range(9):\n res = x*x\n print(res)'
>>> exec(prog)
# 0
# 1
# 4
# 9
# 16
# 25
# 36
# 49
# 64