Использование функции eval() для динамического вычисления выражений

Опубликован: 24.11.2023 60

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

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

Однако, применять функцию eval() следует с особой осторожностью из-за ее способности выполнять программный код, что может иметь серьезные последствия для безопасности.

Общий синтаксис: eval( expression [, globals [, locals] ] )

  • expression - выражение в виде строки, которое необходимо выполнить;
  • globals - словарь глобальных переменных, доступных eval() (опционально);
  • locals - словарь локальных переменных, доступных eval() (опционально).

Если словари globals и locals не указаны, то по умолчанию eval() имеет доступ к текущему пространству глобальных и локальных имен.

Когда вызывается функция eval() содержание expression воспринимается интерпретатором как выражение Python, оно компилируется в байт-код, выполняется и результат возвращается.

# вычисление строковых выражений
eval("5**2")
25
x = 10
eval("x * 3")
30

# вычисление математических выражений
import math
eval("math.sqrt(math.pow(5, 2) + math.pow(10, 3))")
32.01562118716424

# вычисление выражения с List comprehension
eval("[x **2 for x in range(10)]")
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# вычисление булевых выражений
x = 50
y = 100
eval("x != y")
True
eval("x < 100 and y > 100")
False
eval("y in {50, 100, 150, 200}")
True

Примеры использования eval()для вызова доступных встроенных функций

Функцию eval() можно использовать и для обработки более сложных строковых выражений: вызова функций, создания объектов, выполнения системных команд и т.п.

import subprocess

# Запуск команды echo
eval("subprocess.getoutput('echo Hello, World')") 
'Hello, World'

# Запуск Firefox (если он установлен и доступен по path из текущего каталога)
eval("subprocess.getoutput('firefox')")

eval("__import__('math').sqrt(36)")
6.0

Если передать в функцию eval() вместо выражения строку с блоком Python кода, включающего операторы присваивания =, конструкции с if, def, class, циклами for и while, то будет получено исключение SyntaxError.

Для выполнения динамически формируемого программного кода в Python есть отдельная встроенная функция exec(), которая является фактически интерпретатором, встроенным в интерпретатор Python.

Похожие посты

Методы преобразования списка в строку и обратно

Удаление дубликатов из списка

Фильтрация элементов итератора с помощью bool-списка функции itertools.compress()

Пропуск не нужных элементов последовательности с помощью itertools.dropwhile()

Комментариев нет.