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теперь могут передаваться как ключевые слова.
Функция exec() поддерживает динамическое выполнение кода Python и принимает большие блоки кода, в отличие от eval(). Передаваемый функции код должен быть либо строкой, либо объектом кода, например сгенерированный функцией compile().
Во всех случаях ожидается, что исполняемый код будет допустимым для ввода в файл.
Возвращаемое значение - 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