Pythoni eval ()

Meetod eval () sõelub sellele meetodile edastatud avaldise ja käivitab programmis pythoni avaldise (koodi).

Lihtsamalt öeldes eval()käitab funktsioon Pythoni koodi (mis edastatakse argumendina) programmis.

Süntaks eval()on:

 eval (avaldis, globaalid = pole, kohalikud = pole)

eval () parameetrid

eval()Funktsioon võtab kolm parameetrit:

  • avaldis - string parsiti ja hinnati Pythoni avaldisena
  • globaalid (valikuline) - sõnastik
  • kohalikud (valikuline) - kaardistamise objekt. Sõnastik on Pythonis tavaline ja tavaliselt kasutatav kaardistamise tüüp.

Globaalsete ja kohalike kasutamist käsitletakse edaspidi selles artiklis.

Tagastusväärtus väärtuselt eval ()

Meetod eval () tagastab avaldisest hinnatud tulemuse.

Näide 1: kuidas eval () Pythonis töötab

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

Väljund

 2

Siin eval()hindab funktsioon avaldist x + 1ja printseda kasutatakse selle väärtuse kuvamiseks.

Näide 2: praktiline näide evali () kasutamise demonstreerimiseks

 # 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

Väljund

 Sisestage funktsioon: arvuta ala (l) kui pikkus on 1, siis pindala = 1 kui pikkus on 2, siis pindala = 4 kui pikkus on 3, pindala = 9 kui pikkus on 4, siis pindala = 16

Hoiatused evali () kasutamisel

Mõelge olukorrale, kus kasutate Unixi süsteemi (macOS, Linux jne) ja olete osmooduli importinud . OS-moodul pakub kaasaskantavat võimalust kasutada operatsioonisüsteemi funktsioone, näiteks faili lugemist või kirjutamist.

Kui lubate kasutajatel sisestada väärtus kasutades eval(input()), võib kasutaja anda käske muutus faili või isegi kustutada kõik failid käsuga: os.system('rm -rf *').

Kui kasutate eval(input())oma koodis, on mõistlik kontrollida, milliseid muutujaid ja meetodeid kasutaja saab kasutada. Dir () meetodil näete, millised muutujad ja meetodid on saadaval.

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

Väljund

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' lagi ',' kamm ',' koopiakujundus ',' cos ',' cosh ',' kraadid ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'faktoriaal', 'põrand', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hüpot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radiaanid ',' ülejäänud ',' patt ',' sinh ',' sqrt ' ('tan', 'tanh', 'tau', 'trunc')

Saadaolevate meetodite ja muutujate kasutamise piiramine eval ()

Enamasti ei pruugi kõiki avaldises (esimene parameeter kuni eval()) kasutatud meetodeid ja muutujaid vaja minna või neil võib olla isegi turvaauk. Teil võib tekkida vajadus piirata nende meetodite ja muutujate kasutamist eval(). Seda saate teha, edastades funktsioonile valikulised globaalsed ja kohalike parameetrid (sõnastikud) eval().

1. Kui nii globaalsed kui ka kohalikud parameetrid välja jäetakse

Kui mõlemad parameetrid välja jätta (nagu meie varasemates näidetes), käivitatakse avaldis praeguses ulatuses. Saate saadaolevaid muutujaid ja meetodeid kontrollida järgmise koodi abil:

 print(eval('dir()')

2. globaalparameetri edastamine; kohalike parameeter on välja jäetud

Globaalseid ja lokaalseid parameetreid (sõnastikke) kasutatakse vastavalt globaalsete ja kohalike muutujate jaoks. Kui kohalike sõnastik jäetakse välja, on see vaikimisi globaalide sõnastik. See tähendab, et globaalseid kasutatakse nii globaalsete kui ka kohalike muutujate jaoks.

Märkus. Saate kontrollida Pythoni praegust globaalset ja kohalikku sõnastikku, kasutades vastavalt sisseehitatud meetodeid globals () ja localals ().

Näide 3: tühja sõnaraamatu edastamine globaalse parameetrina

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

Väljund

 ('__builtins__') Jälgimine (viimane kõne viimati): fail "", rida 5, trükituna (eval ('sqrt (25)', ())) Fail "", rida 1, NameErroris: nimi 'sqrt' ei ole määratletud

Kui läbite tühja sõnaraamatu globaalsetena, __builtins__on saadaval ainult need expression(esimene parameeter eval()).

Kuigi oleme mathmooduli importinud ülaltoodud programmis, ei pääse avaldis juurde matemaatika mooduli pakutavatele funktsioonidele.

Näide 4: teatud meetodite kättesaadavaks tegemine

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

Väljund

 ('__builtins__', 'pow', 'sqrt')

Siin saab avaldis kasutada ainult sqrt()ja pow()meetodeid koos __builtins__.

Samuti on võimalik avaldise jaoks saadaoleva meetodi nime vastavalt teie soovile muuta:

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

Väljund

 ('__builtins__', 'power', 'square_root') 3.0

Arvutab ülaltoodud programmis square_root()ruutjuure, kasutades sqrt(). sqrt()Otse kasutamise proovimine tekitab siiski vea.

Näide 5: Sisseehitatud seadmete kasutamise piiramine

__builtins__Avaldise kasutamist saate piirata järgmiselt:

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

3. Nii globaalsete kui ka kohalike sõnaraamatu läbimine

Kohalike sõnastikust möödudes saate vajalikud funktsioonid ja muutujad kasutamiseks kättesaadavaks teha. Näiteks:

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

Väljund

 13,0

Selles programmis võib avaldisel olla sqrt()ainult meetod ja muutuja a. Kõik muud meetodid ja muutujad pole saadaval.

eval()Globaalsete ja kohalike sõnaraamatute läbimise kasutamise piiramine muudab teie koodi turvaliseks, eriti kui kasutate eval()meetodi jaoks kasutaja sisendit .

Märkus. Mõnikord eval()pole turvaline isegi piiratud nimedega. Kui objekt ja selle meetodid tehakse kättesaadavaks, saab teha peaaegu kõike. Ainus turvaline viis on kasutaja sisendi valideerimine.

Huvitavad Artiklid...