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!

Частые ошибки

  1. Ошибка синтаксиса в коде:

    exec("x = ")  # Ошибка: SyntaxError
    

    Как исправить: Убедитесь, что строка содержит корректный Python-код.

  2. Неверный тип переданного объекта:

    exec(42)  # Ошибка: TypeError
    

    Как исправить: Передавайте строку или объект, созданный с помощью compile.

  3. Неопределенные переменные в коде:

    exec("z = x + y")  # Ошибка: NameError
    

    Как исправить: Передайте значения переменных через globals или locals.

Часто задаваемые вопросы

  1. Чем exec отличается от eval? exec() выполняет любые инструкции Python, включая определения функций, классов и циклы, а eval() используется только для выражений, возвращающих значение.

  2. Как exec работает с globals и locals? globals определяет глобальные переменные, а locals — локальные. Пример:

    global_env = {"x": 5}
    local_env = {}
    exec("y = x + 10", global_env, local_env)
    print(local_env["y"])  # Вывод: 15
    
  3. Насколько безопасно использовать exec()? Использование exec() НЕБЕЗОПАСНО, если вы выполняете код из ненадежных источников. Это может привести к выполнению вредоносного кода.

  1. Как уменьшить риски при использовании eval()? НИКАК! Любое выполнение пользовательского ввода опасно!

  2. Но что-то же можно сделать? Немного усложнить взлом - можно. Например, передавайте ограниченные словари globals и locals, чтобы ограничить доступ к опасным объектам:

    safe_globals = {"__builtins__": None}
    safe_locals = {"x": 10}
    exec("y = x * 2", safe_globals, safe_locals)
    print(safe_locals["y"])  # Вывод: 20