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