Встроенная функция Python exec()

Из документации Python 3

Эта функция поддерживает динамическое выполнение кода Python. object должен быть либо строкой, либо объектным кодом. Если это строка, строка анализируется как набор операторов Python, который затем выполняется (если не возникает синтаксической ошибки) [...].

Введение

Функция exec() в Python — это встроенная функция, которая позволяет динамически выполнять код Python, хранящийся в строке. Это может быть очень полезно в сценариях, когда вы хотите выполнить код, предоставленный пользователями, сгенерировать и запустить код во время выполнения, или даже создать мини-интерпретаторы или среды сценариев внутри вашего приложения. Однако ее следует использовать с осторожностью, поскольку при неправильной обработке она может представлять угрозу безопасности.

Синтаксис

exec(object[, globals[, locals]])
  • object: Строка, содержащая код Python для выполнения.
  • globals (необязательно): Словарь, представляющий глобальное пространство имен. Если не предоставлено, используется текущее глобальное пространство имен.
  • locals (необязательно): Словарь, представляющий локальное пространство имен. Если не предоставлено, используется текущее локальное пространство имен.

Базовое использование

code_to_execute = "print('Hello, exec()!')"
exec(code_to_execute)
Hello, exec()!

Функция exec() также может использоваться с функцией print() для отображения вывода в консоли.

Выполнение нескольких операторов

code = """
for i in range(5):
    print(i)
"""
exec(code)
0
1
2
3
4

В этом примере функция exec() используется для выполнения цикла for, который перебирает диапазон чисел и выводит каждое число в консоль.

Изменение переменных

x = 10
code = "x += 5"
exec(code)
print(x)
15

Использование globals и locals

x = 5
code = "x = x * 2"
globals_dict = {"x": 10}
locals_dict = {"x": 20}
exec(code, globals_dict, locals_dict)
print(x)
print(globals_dict)
print(locals_dict)
5
{'x': 10}
{'x': 40}

Динамическое создание функций

def create_dynamic_function(name, args):
    code = f"def {name}({', '.join(args)}): return sum({args})"
    exec(code)

create_dynamic_function("add_numbers", ["a", "b", "c"])
result = add_numbers(2, 3, 5)
print(result)
10

В этом примере функция exec() используется для создания динамической функции, которая принимает список аргументов и возвращает их сумму.

Обработка ошибок

code = """
try:
    print(undefined_variable)
except NameError as e:
    print(f"Error: {e}")
"""
exec(code)
Error: name 'undefined_variable' is not defined

Примечание по безопасности

user_input = input("Enter code to execute: ")
exec(user_input)  # Caution: This can be a security risk if not properly sanitized.

Связанные ссылки