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 это было ключевое слово.
Расширенные примеры использования
Динамическое создание классов:
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
Модификация пространств имён с ограничениями:
safe_globals = {"__builtins__": None}
exec("result = 5 * 8", safe_globals)
print(safe_globals["result"])40
Использование exec для конфигурации:
config_code = """
DEBUG = True
MAX_CONNECTIONS = 100
TIMEOUT = 30.5
"""
config = {}
exec(config_code, config)
print(config["MAX_CONNECTIONS"])100
Выполнение кода из файла:
with open('script.py', 'r') as f:
file_content = f.read()
exec(file_content)