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

Python eval()
Python eval() — это встроенная функция, которая анализирует выражение, переданное этой функции, и запускает выражение(код) Python внутри программы.
Синтаксис
Синтаксис метода eval() следующий:
Параметры
- expression — эта строка анализируется и оценивается как выражение Python.
- globals (необязательный) – словарь.
- locals (необязательный) — объект сопоставления. Словарь — это стандартный и широко используемый тип отображения в Python.
См. следующий пример функции eval() в Python.
|
1 2 3 4 |
# app.py k = 21 print(eval('k + 1')) |
Итак, в приведенном выше коде k + 1 оценивается как 21 + 1, и мы получаем результат 22.

Итак, функция eval принимает выражение, выполняет его и выдает результат.
Давайте рассмотрим пример функции eval в реальном времени.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# app.py def square(l): return l*l def cube(l): return l*l*l param = input('Type a function: ') for l in range(1, 5): if(param == 'square(l)'): print('The square of l is:', eval(param)) elif(param == 'cube(l)'): print('The cube of l is:', eval(param)) else: print('You have entered the wrong function') break |
Приведенный выше код имеет два варианта функций:
- Square
- Cube
Если пользователь введет Square(l), то он вернет квадраты значений в цикле for, а если Cube, то создаст кубы каждого значения от 1 до 5.
См. приведенный ниже вывод.

Если вы используете eval(input()) в своем коде, было бы неплохо проверить, какие переменные и методы может использовать пользователь. Вы можете увидеть, какие переменные и функции доступны, используя функцию Python dir().
Чаще всего все доступные функции и переменные, используемые в выражении(первый параметр), могут быть не нужны или даже могут иметь лазейку в безопасности.
Вам может потребоваться ограничить использование этих методов и переменных для метода eval(). Вы можете сделать это, передав необязательные глобальные и локальные параметры(словари) в функцию eval().
Если оба параметра опущены(как в наших предыдущих примерах), выражение выполняется в текущей области видимости. Вы можете проверить доступные переменные и методы, используя следующий код.
|
1 |
print(eval('dir()')) |
Передача параметра globals — параметр locals опущен
Параметры globals и locals(словари) используются для глобальных и локальных переменных соответственно.
Если словарь locals опущен, по умолчанию используется словарь globals. Это означает, что глобальные переменные будут использоваться как для глобальных, так и для локальных переменных. См. следующий пример.
|
1 2 |
from math import * print(eval('dir()', {})) |
Смотрите вывод.

Если вы передаете пустой словарь как глобальный, для expression доступны только __builtins__(первый параметр для eval()). Несмотря на то, что мы импортировали математический модуль в приведенную выше программу, выражение не может получить доступ ни к одной из функций, предоставляемых математическим модулем.
Доступ к определенным методам
Напишите следующий код в файле app.py, чтобы сделать определенные методы доступными для пользователя.
|
1 2 |
from math import * print(eval('dir()', {'sqrt': sqrt, 'pow': pow})) |
См. приведенный ниже вывод.

Здесь выражение также может использовать методы sqrt() и pow() вместе с __builtins__ .
Кроме того, по вашему желанию можно изменить имя метода, доступного для выражения.
Передача как глобального, так и локального словаря
Вы можете сделать необходимые функции и переменные доступными для использования в обход словаря locals. См. следующий пример.
|
1 2 3 4 5 6 |
# app.py from math import * k = 4 print(eval('sqrt(k)', {'__builtins__': None}, {'k': k, 'sqrt': sqrt})) |
Смотрите вывод.

