Python eval ()

Metoda eval () analizează expresia transmisă către această metodă și rulează expresia python (cod) în cadrul programului.

În termeni simpli, eval()funcția rulează codul python (care este transmis ca argument) în cadrul programului.

Sintaxa lui eval()este:

 eval (expresie, globals = None, locals = None)

eval () Parametri

eval()Funcția are trei parametri:

  • expresie - șirul analizat și evaluat ca o expresie Python
  • globals (opțional) - un dicționar
  • localnici (opțional) - un obiect de cartografiere. Dicționarul este tipul de mapare standard și utilizat în mod obișnuit în Python.

Utilizarea globalilor și a localnicilor va fi discutată mai târziu în acest articol.

Valoare returnată din eval ()

Metoda eval () returnează rezultatul evaluat din expresie.

Exemplul 1: Cum funcționează eval () în Python

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

Ieșire

 2

Aici, eval()funcția evaluează expresia x + 1și printeste utilizată pentru a afișa această valoare.

Exemplul 2: Exemplu practic pentru a demonstra utilizarea eval ()

 # 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

Ieșire

 Tastați o funcție: calculateArea (l) Dacă lungimea este 1, Suprafața = 1 Dacă lungimea este 2, Suprafața = 4 Dacă lungimea este 3, Suprafața = 9 Dacă lungimea este 4, Suprafața = 16

Avertismente la utilizarea eval ()

Luați în considerare o situație în care utilizați un sistem Unix (macOS, Linux etc.) și ați importat osmodulul. Modulul OS oferă o modalitate portabilă de a utiliza funcționalitățile sistemului de operare, cum ar fi citirea sau scrierea într-un fișier.

Dacă permite utilizatorilor să introduceți o valoare utilizând eval(input()), utilizatorul poate emite comenzi către fișier schimbare sau chiar să șteargă toate fișierele folosind comanda: os.system('rm -rf *').

Dacă utilizați eval(input())codul dvs., este o idee bună să verificați ce variabile și metode poate folosi utilizatorul. Puteți vedea ce variabile și metode sunt disponibile utilizând metoda dir ().

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

Ieșire

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' pieptene ',' copysign ',' cos ',' cosh ',' grade ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' rest ',' sin ',' sinh ',' sqrt ' , „tan”, „tanh”, „tau”, „trunc”)

Restricționarea utilizării metodelor și variabilelor disponibile în eval ()

Cel mai adesea, toate metodele și variabilele disponibile utilizate în expresie (primul parametru la eval()) pot să nu fie necesare sau chiar să aibă o gaură de securitate. Este posibil să fie necesar să restricționați utilizarea acestor metode și variabile pentru eval(). Puteți face acest lucru trecând parametrii globali și localnici (dicționare) opționale la eval()funcție.

1. Când parametrii globali și localnici au fost omiși

Dacă ambii parametri sunt omiși (ca în exemplele noastre anterioare), expresia este executată în domeniul de aplicare curent. Puteți verifica variabilele și metodele disponibile folosind următorul cod:

 print(eval('dir()')

2. Parametrul global de trecere; parametrul localnici este omis

Parametrii globali și localnici (dicționare) sunt utilizați pentru variabilele globale și, respectiv, locale. Dacă dicționarul local este omis, acesta va fi implicit în dicționarul global. Adică, globalele vor fi utilizate atât pentru variabilele globale, cât și pentru cele locale.

Notă: Puteți verifica dicționarul global și local curent în Python folosind metode încorporate global () și localnici ().

Exemplul 3: Trecerea dicționarului gol ca parametru global

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

Ieșire

 ('__builtins__') Traceback (ultimul apel cel mai recent): Fișier "", linia 5, în tipărire (eval ('sqrt (25)', ())) Fișier "", linia 1, în NameError: nume 'sqrt' nu este definit

Dacă treceți un dicționar gol ca global, __builtins__sunt disponibile numai pentru expression(primul parametru pentru eval()).

Chiar dacă am importat mathmodulul în programul de mai sus, expresia nu poate accesa funcțiile furnizate de modulul matematic.

Exemplul 4: Punerea la dispoziție a anumitor metode

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

Ieșire

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

Aici, expresia poate utiliza doar sqrt()și pow()metodele , împreună cu __builtins__.

De asemenea, este posibil să schimbați numele metodei disponibile pentru exprimare în funcție de dorința dvs.:

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

Ieșire

 („__builtins__”, „power”, „root_ square”) 3.0

În programul de mai sus, square_root()calculează rădăcina pătrată folosind sqrt(). Cu toate acestea, încercarea de utilizare sqrt()directă va genera o eroare.

Exemplul 5: restricționarea utilizării dispozitivelor încorporate

Puteți restricționa utilizarea __builtins__în expresie după cum urmează:

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

3. Trecerea atât a dicționarului global, cât și al localnicilor

Puteți pune la dispoziție funcțiile și variabilele necesare pentru a fi utilizate, trecând dicționarul localnicilor. De exemplu:

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

Ieșire

 13.0

În acest program, expresia poate avea doar sqrt()metoda și variabila a. Toate celelalte metode și variabile nu sunt disponibile.

Restricționarea utilizării eval()prin trecerea dicționarelor globale și locale va face codul dvs. sigur, mai ales atunci când utilizați informațiile furnizate de utilizator eval()metodei.

Notă: Uneori, eval()nu este sigur chiar și cu nume limitate. Când un obiect și metodele sale sunt accesibile, se poate face aproape orice. Singura modalitate sigură este prin validarea datelor introduse de utilizator.

Articole interesante...