Функция exec
в Python используется для выполнения динамически созданного кода, представленного строкой или объектом кода. В отличие от функции eval
, которая вычисляет выражение и возвращает его значение, exec
выполняет команды и инструкции на языке Python и не возвращает результат.
Содержание
- Синтаксис
- Параметры
- Возвращаемое значение
- Примеры использования
- Пример 1: Выполнение строки кода
- Пример 2: Определение функции динамически
- Пример 3: Использование глобального и локального пространства имен
- Примеры практического применения
- Пример 4: Выполнение кода из файла
- Пример 5: Генерация и выполнение кода на лету
- Важные замечания
Синтаксис
exec(object, globals=None, locals=None)
Параметры
object
: Обязательный параметр. Строка или объект кода, содержащий команды и инструкции на языке Python, которые нужно выполнить.globals
: Необязательный параметр. Словарь, определяющий глобальное пространство имен.locals
: Необязательный параметр. Словарь или любой отображаемый объект, определяющий локальное пространство имен.
Возвращаемое значение
Функция exec
не возвращает значения. Она выполняет переданный ей код.
Примеры использования
Пример 1: Выполнение строки кода
exec('print("Hello, World!")')
Вывод:
Hello, World!
Пример 2: Определение функции динамически
code = """
def greet(name):
print(f"Hello, {name}!")
"""
exec(code)
greet("Alice")
Вывод:
Hello, Alice!
Пример 3: Использование глобального и локального пространства имен
globals_dict = {'x': 5}
locals_dict = {'y': 10}
code = 'z = x + y'
exec(code, globals_dict, locals_dict)
print(locals_dict['z']) # Вывод: 15
Примеры практического применения
Пример 4: Выполнение кода из файла
with open('script.py', 'r') as file:
code = file.read()
exec(code)
Пример 5: Генерация и выполнение кода на лету
for i in range(5):
exec(f'print("This is iteration {i}")')
Вывод:
This is iteration 0
This is iteration 1
This is iteration 2
This is iteration 3
This is iteration 4
Важные замечания
Безопасность: Использование exec
с недоверенными данными может быть крайне опасным, так как это позволяет выполнение произвольного кода. Это может привести к серьезным проблемам безопасности.
НЕ ВЫПОЛНЯЙТЕ КОД ПРЕДСТАВЛЕННЫЙ НИЖЕ
# Никогда не используйте exec с недоверенными данными
user_input = "__import__('os').system('rm -rf /')"
exec(user_input) # Это может удалить все файлы на вашей системе
Оптимизация: Код, выполняемый с помощью exec
, обычно выполняется медленнее, чем статический код, так как он не может быть оптимизирован компилятором.