exec
Функция exec() выполняет строку Python-кода или объект кода. В отличие от eval(), она может выполнять сложные конструкции, такие как определения функций, классов и другие инструкции Python.
Синтаксис
exec(object, globals=None, locals=None)
Аргументы
- object:
- Что означает: Строка или объект кода, содержащий инструкции Python, которые необходимо выполнить.
- Возможные значения: Строка, содержащая корректный Python-код, или объект, возвращаемый функцией compile.
- globals (необязательный):
- Что означает: Словарь глобальных переменных, доступных во время выполнения.
- Возможные значения: Любой объект типа dict.
- locals (необязательный):
- Что означает: Словарь локальных переменных, доступных во время выполнения.
- Возможные значения: Любой объект типа dict.
Возвращаемое значение
Функция exec() всегда возвращает None.
Примеры использования
# Выполнение строкового Python-кода
code = "x = 10\ny = 20\nprint(x + y)"
exec(code)
# Вывод: 30
# Использование окружения с globals и locals
global_env = {"x": 5}
local_env = {"y": 15}
exec("z = x + y", global_env, local_env)
print(local_env["z"]) # Вывод: 20
# Определение функции с помощью exec
code = """
def greet(name):
return f"Hello, {name}!"
"""
exec(code)
print(greet("Alice")) # Вывод: Hello, Alice!
Частые ошибки
Ошибка синтаксиса в коде:
exec("x = ") # Ошибка: SyntaxError
Как исправить: Убедитесь, что строка содержит корректный Python-код.
Неверный тип переданного объекта:
exec(42) # Ошибка: TypeError
Как исправить: Передавайте строку или объект, созданный с помощью compile.
Неопределенные переменные в коде:
exec("z = x + y") # Ошибка: NameError
Как исправить: Передайте значения переменных через globals или locals.
Часто задаваемые вопросы
Чем exec отличается от eval? exec() выполняет любые инструкции Python, включая определения функций, классов и циклы, а eval() используется только для выражений, возвращающих значение.
Как exec работает с globals и locals? globals определяет глобальные переменные, а locals — локальные. Пример:
global_env = {"x": 5} local_env = {} exec("y = x + 10", global_env, local_env) print(local_env["y"]) # Вывод: 15
Насколько безопасно использовать exec()? Использование exec() НЕБЕЗОПАСНО, если вы выполняете код из ненадежных источников. Это может привести к выполнению вредоносного кода.
Как уменьшить риски при использовании eval()? НИКАК! Любое выполнение пользовательского ввода опасно!
Но что-то же можно сделать? Немного усложнить взлом - можно. Например, передавайте ограниченные словари globals и locals, чтобы ограничить доступ к опасным объектам:
safe_globals = {"__builtins__": None} safe_locals = {"x": 10} exec("y = x * 2", safe_globals, safe_locals) print(safe_locals["y"]) # Вывод: 20