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 print
este 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 os
modulul. 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 math
modulul î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.