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 + 1
in print
se 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 os
modul. 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 math
modul 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.