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

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

Синтаксис:

exec(object, /, globals=None, locals=None, *, closure=None)

Параметры:

  • object - строка кода, либо объект кода,
  • globals - словарь глобального пространства, относительно которого следует исполнить код,
  • locals - объект-отображение (например dict), локальное пространство, в котором следует исполнить код.
  • closure=None - определяет замыкание - кортеж переменных (добавлен в Python 3.11).

Изменено в Python 3.11: Добавлен ключевой аргумент closure.

Изменено в Python 3.13: аргументы globals и locals теперь могут передаваться как ключевые слова.

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

  • None.

Описание:

Функция exec() поддерживает динамическое выполнение кода Python и принимает большие блоки кода, в отличие от eval(). Передаваемый функции код должен быть либо строкой, либо объектом кода, например сгенерированный функцией compile().

  • Если это строка, то строка анализируется как набор операторов Python, который затем выполняется (если не возникает синтаксическая ошибка).
  • Если это объект кода, он просто выполняется.

Во всех случаях ожидается, что исполняемый код будет допустимым для ввода в файл.

Возвращаемое значение - None.

Во всех случаях, если globals и locals опущены, то код выполняется в текущей области видимости. Если указываются глобальные переменные, это должен быть словарь (а не подкласс словаря), который будет использоваться как для глобальных, так и для локальных переменных. Если передаются локальные переменные, то locals может быть любым объектом отображения (словарным объектом).

Помните, что на уровне модуля глобальные и локальные переменные — это один и тот же словарь. Если exec получает два отдельных объекта в качестве глобального и локального, код будет выполняться так, как если бы он был встроен в определение класса.

Внимание:

  • Помните, что инструкции nonlocal, return и yield не могут быть использованы вне определений функций, даже в контексте кода, переданного в exec().
  • Помните, что на уровне модуля globals и locals - один и тот же словарь. Если exec() получает два отдельных объекта globals и locals, то код будет исполнен, как если бы он был расположен в объявлении класса.

Если словарь globals не содержит значения для ключа __builtins__, то передается встроенное builtins пространство. Таким образом, можно контролировать, какие встроенные функции доступны для исполняемого кода, вставляя свой собственный __builtins__ словарь в глобальные переменные перед его передачей exec().

  • Встроенные функции globals() и locals() возвращают текущий глобальный и локальный словарь, соответственно, которые могут быть полезны для передачи в качестве globals и locals аргументов функции exec().
  • Не следует пытаться модифицировать словарь locals(). Если требуется влияние кода, исполненного exec() на локальную область, явно передавайте словарь locals.

Изменено в Python 3.13: семантика пространства имен locals по умолчанию была скорректирована, как описано для встроенной функции locals().

Аргумент closure определяет замыкание - кортеж переменных. Это допустимо только в том случае, если объект является кодовым объектом, содержащим свободные переменные. Длина кортежа должна точно соответствовать количеству свободных переменных, на которые ссылается объект кода.

Примеры динамического выполнения блока кода.

>>> 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