Сообщить об ошибке.

Позволяет динамически выполнить блок кода Python.

Синтаксис:

exec(object, globals=None, locals=None)

Параметры:

  • object - строка кода, либо объект кода,
  • globals - словарь глобального пространства, относительно которого следует исполнить код,
  • locals - объект-отображение (например dict), локальное пространство, в котором следует исполнить код.

Возвращаемое значение:

  • None.

Описание:

Функция 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