Exec: примеры (PYTHON)

Функция exec в Python: руководство с примерами кода
Раздел: Встроенные функции, Динамическое выполнение
exec(object[, globals[, locals]]): None

Функция exec в Python

Функция exec выполняет динамически созданный код Python, который может быть представлен в виде строки или объекта кода. Она часто используется для выполнения кода, сгенерированного во время выполнения программы, в конфигурационных скриптах, плагинных системах или образовательных приложениях.

Аргументы функции:

  • object - обязательный аргумент, содержащий код для выполнения. Может быть строкой, bytes-like объектом или объектом code.
  • globals - необязательный словарь, определяющий глобальное пространство имён. По умолчанию используется текущее глобальное пространство.
  • locals - необязательный словарь, определяющий локальное пространство имён. По умолчанию используется текущее локальное пространство.

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

Функция exec всегда возвращает None. Результат выполнения кода сохраняется в изменениях пространств имён, переданных в аргументах.

Примеры использования exec

Простое выполнение строки кода:

code = "print('Привет, мир!')"
exec(code)
Привет, мир!

Использование глобального и локального пространств имён:

globals_dict = {}
locals_dict = {}
exec("x = 10 + 5", globals_dict, locals_dict)
print(locals_dict['x'])
15

Выполнение кода из объекта code:

code_obj = compile("y = [i**2 for i in range(5)]", "", 'exec')
exec(code_obj)
print(y)
[0, 1, 4, 9, 16]

Похожие функции в Python

  • eval() - выполняет выражение и возвращает его значение. Подходит только для одиночных выражений, а не для блоков кода.
  • compile() - компилирует исходный код в объект кода, который затем может быть передан в exec или eval. Позволяет предварительно обработать код.

Функцию eval предпочтительнее использовать, когда нужно вычислить одно выражение и получить результат. Функция compile полезна при многократном выполнении одного и того же кода.

Аналоги функции в других языках

JavaScript:

eval("let z = 3 + 2; console.log(z);");
5

В отличие от Python, eval в JavaScript возвращает результат выполнения выражения.

PHP:

eval("\$w = 5 * 2; echo \$w;");
10

Функция eval в PHP выполняет код как часть скрипта и требует завершения строк точкой с запятой.

Lua:

loadstring("v = 7 - 1")()
print(v)
6

Lua использует функцию loadstring для загрузки и выполнения строки кода, которая затем вызывается как функция.

Типичные ошибки

Использование exec с ненадёжным вводом:

user_input = "__import__('os').system('rm -rf /')"
exec(user_input)  # Опасная операция!

Результат:

Может привести к удалению файлов в системе. Всегда проверяйте и ограничивайте ввод.

Попытка получить возвращаемое значение:

result = exec("2 + 2")  # exec всегда возвращает None
print(result)
None

Неправильные пространства имён:

exec("print(a)", {})  # Переменная a не определена
NameError: name 'a' is not defined

Изменения в последних версиях Python

В Python 3.11 функция exec получила улучшения производительности за счет оптимизации интерпретатора. В Python 3.10 были обновлены сообщения об ошибках для лучшей диагностики проблем. Начиная с Python 3, exec является функцией, тогда как в Python 2 это было ключевое слово.

Расширенные примеры использования

Динамическое создание классов:

Пример python
class_code = '''
class DynamicClass:
    def __init__(self, value):
        self.value = value
    def show(self):
        return f"Значение: {self.value}"
'''
exec(class_code)
obj = DynamicClass(42)
print(obj.show())
Значение: 42

Модификация пространств имён с ограничениями:

Пример python
safe_globals = {"__builtins__": None}
exec("result = 5 * 8", safe_globals)
print(safe_globals["result"])
40

Использование exec для конфигурации:

Пример python
config_code = """
DEBUG = True
MAX_CONNECTIONS = 100
TIMEOUT = 30.5
"""
config = {}
exec(config_code, config)
print(config["MAX_CONNECTIONS"])
100

Выполнение кода из файла:

Пример python
with open('script.py', 'r') as f:
    file_content = f.read()
exec(file_content)

питон exec function comments

En
Exec Execute dynamic code