Питхон евал ()

Метода евал () рашчлањује израз прослеђен овој методи и покреће питхон израз (код) унутар програма.

Једноставно речено, eval()функција покреће питхон код (који се предаје као аргумент) унутар програма.

Синтакса eval()је:

 евал (израз, глобалс = Ноне, лоцал = Ноне)

параметри евал ()

eval()Функција узима три параметра:

  • израз - низ рашчлањен и оцењен као Питхон израз
  • глобали (опционо) - речник
  • локално становништво (опционално) - објекат за мапирање. Речник је стандардни и често коришћени тип мапирања у Питхону.

О употреби глобалних и локалних становника говориће се касније у овом чланку.

Повратна вредност од евал ()

Метода евал () враћа резултат процењен из израза.

Пример 1: Како евал () ради у Питхону

 x = 1 print(eval('x + 1'))

Оутпут

 2

Овде eval()функција процењује израз x + 1и printкористи се за приказ ове вредности.

Пример 2: Практични пример за демонстрацију употребе евал ()

 # Perimeter of Square def calculatePerimeter(l): return 4*l # Area of Square def calculateArea(l): return l*l expression = input("Type a function: ") for l in range(1, 5): if (expression == 'calculatePerimeter(l)'): print("If length is ", l, ", Perimeter = ", eval(expression)) elif (expression == 'calculateArea(l)'): print("If length is ", l, ", Area = ", eval(expression)) else: print('Wrong Function') break

Оутпут

 Укуцајте функцију: израчунајтеПодручје (л) Ако је дужина 1, Површина = 1 Ако је дужина 2, Површина = 4 Ако је дужина 3, Површина = 9 Ако је дужина 4, Површина = 16

Упозорења када користите евал ()

Размотрите ситуацију у којој користите Уник систем (мацОС, Линук итд.) И увезли сте osмодул. Ос модул пружа преносиви начин за коришћење функционалности оперативног система попут читања или писања у датотеку.

Ако дозволите корисницима да унесете вредност користећи eval(input()), корисник може издати наредбе да се измене датотеке или чак избрисати све датотеке користећи команду: os.system('rm -rf *').

Ако користите eval(input())свој код, добра је идеја да проверите које променљиве и методе корисник може да користи. Помоћу методе дир () можете видети које су променљиве и методе доступне.

 from math import * print(eval('dir()'))

Оутпут

('__аннотатионс__', '__буилтинс__', '__цацхед__', '__доц__', '__филе__', '__лоадер__', '__наме__', '__пацкаге__', '__спец__', 'ацос', 'ацосх', 'асин', ' асинх ',' атан ',' атан2 ',' атанх ',' цеил ',' цомб ',' цописигн ',' цос ',' цосх ',' степени ',' дист ',' е ',' ерф ' , 'ерфц', 'екп', 'екпм1', 'фабс', 'фацториал', 'флоор', 'фмод', 'фрекп', 'фсум', 'гамма', 'гцд', 'хипот', ' инф ',' исцлосе ',' исфините ',' исинф ',' иснан ',' искрт ',' лдекп ',' лгамма ',' лог ',' лог10 ',' лог1п ','лог2 ',' модф ',' нан ',' ос ',' перм ',' пи ',' пов ',' прод ',' радианс ',' остатак ',' син ',' синх ',' скрт ' , 'тан', 'танх', 'тау', 'трунц')

Ограничавање употребе доступних метода и променљивих у евал ()

Чешће него не, све доступне методе и променљиве коришћене у изразу (први параметар до eval()) можда неће бити потребне или чак могу имати сигурносну рупу. Можда ћете морати да ограничите употребу ових метода и променљивих за eval(). То можете учинити прослеђивањем eval()функције опционим глобалним и локалним параметрима (речницима) .

1. Када су изостављени и глобални и локални параметри

Ако су оба параметра изостављена (као у нашим ранијим примерима), израз се извршава у тренутном опсегу. Доступне променљиве и методе можете проверити помоћу следећег кода:

 print(eval('dir()')

2. Пролазни глобални параметар; Параметар локално становништво је изостављен

Глобални и локални параметри (речници) користе се за глобалне и локалне променљиве. Ако је речник локалног становништва изостављен, подразумевано се користи глобални речник. Значи, глобали ће се користити и за глобалне и за локалне променљиве.

Напомена: Тренутни глобални и локални речник у Питхону можете проверити помоћу уграђених метода глобалс () и лоцал ().

Пример 3: Прослеђивање празног речника као глобалног параметра

 from math import * print(eval('dir()', ())) # The code will raise an exception print(eval('sqrt(25)', ()))

Оутпут

 ('__буилтинс__') Трацебацк (последњи последњи позив): Датотека "", ред 5, у испису (евал ('скрт (25)', ())) Датотека "", ред 1, у НамеЕррор: наме 'скрт' није дефинисана

Ако празан речник предате као глобални, __builtins__доступни су само expression(први параметар eval()).

Иако смо mathмодул увезли у горњи програм, израз не може приступити ниједној функцији коју пружа математички модул.

Пример 4: Доступност одређених метода

 from math import * print(eval('dir()', ('sqrt': sqrt, 'pow': pow)))

Оутпут

 ('__буилтинс__', 'пов', 'скрт')

Овде израз може да користи само методе sqrt()и и pow()заједно са __builtins__.

Такође је могуће променити назив методе која је доступна за израз према вашој жељи:

 from math import * names = ('square_root': sqrt, 'power': pow) print(eval('dir()', names)) # Using square_root in Expression print(eval('square_root(9)', names))

Оутпут

 ('__буилтинс__', 'повер', 'скуаре_роот') 3.0

У горњем програму square_root()израчунава квадратни корен користећи sqrt(). Међутим, покушај sqrt()директне употребе ће довести до грешке.

Пример 5: Ограничавање употребе уграђених датотека

Употребу __builtins__у изразу можете ограничити на следећи начин:

 eval(expression, ('__builtins__': None))

3. Полагање и глобалног и локалног речника

Потребне функције и променљиве можете учинити доступним за употребу прослеђивањем локалног речника. На пример:

 from math import * a = 169 print(eval('sqrt(a)', ('__builtins__': None), ('a': a, 'sqrt': sqrt)))

Оутпут

 13.0

У овом програму израз може имати само sqrt()методу и променљиву а. Све остале методе и променљиве нису доступне.

Ограничење употребе eval()прослеђивањем глобалних и локалних речника учиниће ваш код сигурним, посебно када користите eval()метод који корисник уноси у метод.

Напомена: Понекад eval()није сигурно чак ни са ограниченим именима. Када се објект и његове методе учине доступним, може се учинити готово све. Једини сигуран начин је потврђивање корисничког уноса.

Занимљиви Чланци...