Опубликован: 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()
Комментариев нет.