Python eval ()

Metoda eval () razčleni izraz, poslan tej metodi, in v programu zažene izraz python (kodo).

Preprosto povedano, eval()funkcija v programu zažene kodo python (ki se posreduje kot argument).

Sintaksa eval()je:

 eval (izraz, globalno = brez, lokalno = brez)

parametri eval ()

eval()Funkcija traja tri parametre:

  • izraz - niz je bil razčlenjen in ovrednoten kot izraz Python
  • globals (neobvezno) - slovar
  • domačini (neobvezno) - objekt za preslikavo. Slovar je standardni in pogosto uporabljeni tip preslikave v Pythonu.

O uporabi globalov in domačinov bomo govorili kasneje v tem članku.

Vrnjena vrednost od eval ()

Metoda eval () vrne rezultat, ovrednoten iz izraza.

Primer 1: Kako eval () deluje v Pythonu

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

Izhod

 2.

Tu eval()funkcija ovrednoti izraz x + 1in printse uporablja za prikaz te vrednosti.

Primer 2: Praktični primer za prikaz uporabe 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

Izhod

 Vnesite funkcijo: izračunajte Površina (l) Če je dolžina 1, Območje = 1 Če je dolžina 2, Območje = 4 Če je dolžina 3, Območje = 9 Če je dolžina 4, Območje = 16

Opozorila pri uporabi eval ()

Razmislite o situaciji, ko uporabljate sistem Unix (macOS, Linux itd.) In ste uvozili osmodul. Modul os omogoča prenosljiv način uporabe funkcij operacijskega sistema, kot sta branje ali pisanje v datoteko.

Če dovolite uporabnikom za vnos vrednosti uporabi eval(input()), lahko uporabnik izda ukaze v datoteko sprememb ali celo izbriše vse datoteke z ukazom: os.system('rm -rf *').

Če uporabljate eval(input())svojo kodo, je dobro preveriti, katere spremenljivke in metode lahko uporabnik uporablja. Katere spremenljivke in metode so na voljo, lahko vidite z metodo dir ().

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

Izhod

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

Omejevanje uporabe razpoložljivih metod in spremenljivk v eval ()

Pogosteje vse razpoložljive metode in spremenljivke, uporabljene v izrazu (prvi parameter do eval()), morda niso potrebne ali pa imajo celo varnostno luknjo. Morda boste morali omejiti uporabo teh metod in spremenljivk za eval(). To lahko storite tako, da eval()funkciji posredujete neobvezne globalne in lokalne parametre (slovarje) .

1. Ko so izpuščeni tako globalni kot domači parametri

Če sta oba parametra izpuščena (kot v naših prejšnjih primerih), se izraz izvede v trenutnem obsegu. Razpoložljive spremenljivke in metode lahko preverite z naslednjo kodo:

 print(eval('dir()')

2. podajanje globalnega parametra; parameter »domačini« je izpuščen

Za globalne in lokalne spremenljivke se uporabljata globalna in lokalna parametra (slovarji). Če je slovar domačinov izpuščen, je privzeto globalni slovar. Kar pomeni, da se bodo globalni uporabljali tako za globalne kot lokalne spremenljivke.

Opomba: Trenutni globalni in lokalni slovar v Pythonu lahko preverite z uporabo vgrajenih metod globals () in local ().

3. primer: posredovanje praznega slovarja kot globalnega parametra

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

Izhod

 ('__builtins__') Sledenje (zadnji zadnji klic): Datoteka "", vrstica 5, v tisku (eval ('sqrt (25)', ())) Datoteka "", vrstica 1, v NameError: ime 'sqrt' ni definirano

Če posredujete prazen slovar kot globalno, __builtins__so na voljo samo expression(prvi parameter v eval()).

Čeprav smo mathmodul uvozili v zgornji program, izraz ne more dostopati do funkcij, ki jih zagotavlja matematični modul.

Primer 4: omogočanje nekaterih metod

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

Izhod

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

Tu lahko izraz uporablja samo sqrt()in in pow()metode skupaj z __builtins__.

Možno je tudi spremeniti ime metode, ki je na voljo za izraz, glede na vaše želje:

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

Izhod

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

V zgornjem programu square_root()izračuna kvadratni koren z uporabo sqrt(). Vendar bo poskus sqrt()neposredne uporabe povzročil napako.

Primer 5: Omejevanje uporabe vgrajenih datotek

Uporabo __builtins__v izrazu lahko omejite na naslednji način:

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

3. Prenos slovarja tako globalnega kot domačega

S posredovanjem slovarja domačinov lahko omogočite potrebne funkcije in spremenljivke. Na primer:

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

Izhod

 13,0

V tem programu ima izraz lahko samo sqrt()metodo in spremenljivko a. Vse druge metode in spremenljivke niso na voljo.

Omejitev uporabe eval()posredovanja slovarjev globalnih in lokalnih besed bo vašo kodo zagotovilo varno, zlasti če uporabljate vnos, ki ga uporabnik vnese v eval()metodo.

Opomba: Včasih eval()ni varna niti z omejenimi imeni. Ko so predmet in njegove metode dostopne, je mogoče storiti skoraj vse. Edini varen način je preverjanje uporabniškega vnosa.

Zanimive Članki...