Автор оригинала: Pankaj Kumar.
Функция Python Eval () используется для анализа строки экспрессии в виде выражения Python, а затем выполнить его.
Python Eval () Функция
Подпись функции Python Eval ():
eval(expression, globals=None, locals=None)
выражение – Обязательный строковый параметр, это анализируется и выполняется в виде выражения Python.
глобал – Словарь используется для указания доступных выражений для выполнения. Стандартные встроенные методы доступны, если явно не ограничивается использованием '__Builtins__': нет
элемент.
Местные жители – Используется для указания локальных переменных и методов, доступных для EVAL () функции.
Пример Python Eval ()
Сначала посмотрим на простой пример функции Python Eval ().
x = 1 print(eval('x==1')) print(eval('x+2'))
Выход:
True 3
Python eval () с пользовательским входом
Приведенный выше примером функции Eval () очень ограничен и не оправдывает свою мощность. Функция Power of Eval () заключается в динамическом выполнении операторов. Мы можем выполнить произвольные объекты кода с использованием функции EVAL ().
Давайте посмотрим на более сложный пример, где мы попросим пользователя вводить функции для выполнения.
# eval() with user input from math import * for l in range(1, 3): func = input("Enter Math Function to Evaluate:\n") try: print(eval(func)) except Exception as ex: print(ex) break print('Done')
Ниже приведено изображение пример выполнения вышеуказанного скрипта Python.
Без функции eval мы не можем выполнить введенные команды пользователей. Это мощность функции EVAL ().
Риски безопасности с функцией Eval ()
С большой силой приходит большая ответственность очень верно, если вы позволяете выполнять пользовательский ввод в качестве команды.
Что делать, если у нас есть ОС модуль Imported и пользователь входит в OS.System ('RM -RF/')
Команда для выполнения. Это начнет удаление системных файлов и повредить нашу среду.
Вот почему, когда вы используете функцию eval (), чтобы выполнить код ввода пользователя, вам необходимо убедиться, что введенные введенные данные проверяются сначала, и если они в порядке, то только его выполняется. Это когда глобали и параметры местных жителей пригодны.
Python Eval () глобал и местные жители
Прежде чем мы решим, какие функции мы должны сделать доступными для EVAL (), нам нужно выяснить, какие все функции и переменные присутствуют в глобальном и локальном объеме. Мы можем найти эту информацию, используя глобал ()
, Местные жители ()
и dir ()
Встроенные функции.
Давайте посмотрим на пример, где мы узнаем функции и переменные, доступные в глобальном и локальном объеме.
from math import * def square_root(n): return sqrt(n) print(globals()) # dictionary representing the current global symbol table. print(locals()) # dictionary representing the current local symbol table. print(dir()) # list of names in the current local scope
Выход:
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x105b11400>, '__spec__': None, '__annotations__': {}, '__builtins__':, '__file__': '/Users/pankaj/Documents/PycharmProjects/BasicPython/basic_examples/eval_example.py', '__cached__': None, 'acos': , 'acosh': , 'asin': , 'asinh': , 'atan': , 'atan2': , 'atanh': , 'ceil': , 'copysign': , 'cos': , 'cosh': , 'degrees': , 'erf': , 'erfc': , 'exp': , 'expm1': , 'fabs': , 'factorial': , 'floor': , 'fmod': , 'frexp': , 'fsum': , 'gamma': , 'gcd': , 'hypot': , 'isclose': , 'isfinite': , 'isinf': , 'isnan': , 'ldexp': , 'lgamma': , 'log': , 'log1p': , 'log10': , 'log2': , 'modf': , 'pow': , 'radians': , 'remainder': , 'sin': , 'sinh': , 'sqrt': , 'tan': , 'tanh': , 'trunc': , 'pi': 3.141592653589793, 'e': 2.718281828459045, 'tau': 6.283185307179586, 'inf': inf, 'nan': nan, 'square_root': } {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x105b11400>, '__spec__': None, '__annotations__': {}, '__builtins__': , '__file__': '/Users/pankaj/Documents/PycharmProjects/BasicPython/basic_examples/eval_example.py', '__cached__': None, 'acos': , 'acosh': , 'asin': , 'asinh': , 'atan': , 'atan2': , 'atanh': , 'ceil': , 'copysign': , 'cos': , 'cosh': , 'degrees': , 'erf': , 'erfc': , 'exp': , 'expm1': , 'fabs': , 'factorial': , 'floor': , 'fmod': , 'frexp': , 'fsum': , 'gamma': , 'gcd': , 'hypot': , 'isclose': , 'isfinite': , 'isinf': , 'isnan': , 'ldexp': , 'lgamma': , 'log': , 'log1p': , 'log10': , 'log2': , 'modf': , 'pow': , 'radians': , 'remainder': , 'sin': , 'sinh': , 'sqrt': , 'tan': , 'tanh': , 'trunc': , 'pi': 3.141592653589793, 'e': 2.718281828459045, 'tau': 6.283185307179586, 'inf': inf, 'nan': nan, 'square_root': } ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'square_root', 'tan', 'tanh', 'tau', 'trunc']
Это много функций, которые EVAL () будут иметь доступ к. Большинство из них от __Builtins__ и математического модуля.
Посмотрим, что произойдет, когда мы указываем глобал
Значение как пустой словарь в функции Eval.
print(eval('dir()',{}))
Выход:
['__builtins__']
Таким образом, встроенные методы все еще доступны для Eval Function. Если вы хотите ограничить доступ только к нескольким встраиваемым методам, вы можете указать его значение для глобалов. Например, ниже код разрешает функцию EVAL () для выполнения только встроенной функции Min.
print(eval('min(1,2)',{'__builtins__':{'min': min}})) # 1
Давайте посмотрим на другой пример, где я предоставляю значение местных жителей и отключение всех встроенных функций доступа для EVAL ().
y=5 print(eval('y+1',{'__builtins__': None}, {'y': y})) # 6
Давайте посмотрим на окончательный пример, где я получаю доступ только к нескольким методам из математического модуля. Мы также отображаем Square_root к SQRT функция для лучшей человеческой читаемости.
from math import * for l in range(1, 3): func = input("Enter Math Function to Evaluate.\nAllowed Functions are: square_root(x) and pow(x,y):\n") try: print(eval(func, {'square_root': sqrt, 'pow': pow})) except Exception as ex: print(ex) break print('Done')
Выход пример:
Enter Math Function to Evaluate. Allowed Functions are: square_root(x) and pow(x,y): square_root(16) 4.0 Enter Math Function to Evaluate. Allowed Functions are: square_root(x) and pow(x,y): log10(100) name 'log10' is not defined Done
Я не указал ничего для встроенных функций, поэтому они будут доступны для функции eval ().
Ниже приведен другой пример, чтобы показать, что встроенные функции доступны для выполнения.
Enter Math Function to Evaluate. Allowed Functions are: square_root(x) and pow(x,y): min(5,4) 4 Enter Math Function to Evaluate. Allowed Functions are: square_root(x) and pow(x,y): max(10,20) 20
Резюме
Функция Python Eval () очень мощная. Несмотря на то, что у нас есть глобальные и местные органы переменной для ограничения доступа, им не хватает, а обходные пути доступны для вреда вашей системе. Прочитайте эту статью, объясняя Почему Eval опасен Отказ Вы не должны использовать функцию Eval () с ненадежными пользовательскими входами.