Python eval ()

Metoda eval () raščlanjuje izraz proslijeđen ovoj metodi i pokreće python izraz (kod) unutar programa.

Jednostavno rečeno, eval()funkcija pokreće python kôd (koji se predaje kao argument) unutar programa.

Sintaksa eval()je:

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

parametri eval ()

eval()Funkcija traje tri parametra:

  • izraz - niz raščlanjen i procijenjen kao Python izraz
  • globali (neobavezno) - rječnik
  • lokalno stanovništvo (nije obavezno) - objekt za mapiranje. Rječnik je standardni i često korišteni tip mapiranja u Pythonu.

O upotrebi globalnih i lokalnih stanovnika bit će riječi kasnije u ovom članku.

Povratna vrijednost od eval ()

Metoda eval () vraća rezultat vrednovan iz izraza.

Primjer 1: Kako eval () radi u Pythonu

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

Izlaz

 2

Ovdje eval()funkcija procjenjuje izraz x + 1i printkoristi se za prikaz ove vrijednosti.

Primjer 2: Praktični primjer za pokazivanje upotrebe evala ()

 # 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

Izlaz

 Upišite funkciju: izračunajtePodručje (l) Ako je duljina 1, Površina = 1 Ako je duljina 2, Površina = 4 Ako je duljina 3, Površina = 9 Ako je duljina 4, Površina = 16

Upozorenja pri korištenju eval ()

Razmotrite situaciju u kojoj koristite Unix sustav (macOS, Linux itd.) I uvezli ste osmodul. Os modul pruža prijenosni način korištenja funkcionalnosti operativnog sustava poput čitanja ili pisanja u datoteku.

Ako omogućiti korisnicima da unos vrijednosti pomoću eval(input()), korisnik može izdati naredbe za promjenu datoteke ili čak izbrisati sve datoteke pomoću naredbe: os.system('rm -rf *').

Ako koristite eval(input())svoj kod, dobra je ideja provjeriti koje varijable i metode korisnik može koristiti. Pomoću metode dir () možete vidjeti koje su varijable i metode dostupne.

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

Izlaz

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' ceil ',' češalj ',' copysign ',' cos ',' cosh ',' stupnjevi ',' 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 ',' ostatak ',' sin ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Ograničavanje upotrebe dostupnih metoda i varijabli u evalu ()

Češće nego ne, sve dostupne metode i varijable korištene u izrazu (prvi parametar do eval()) možda neće biti potrebne, ili čak mogu imati sigurnosnu rupu. Možda ćete trebati ograničiti upotrebu ovih metoda i varijabli za eval(). To možete učiniti prosljeđivanjem eval()funkcije opcijskim globalnim i lokalnim parametrima (rječnicima) .

1. Kada su izostavljeni i globalni i lokalni parametri

Ako su oba parametra izostavljena (kao u našim ranijim primjerima), izraz se izvršava u trenutnom opsegu. Dostupne varijable i metode možete provjeriti pomoću sljedećeg koda:

 print(eval('dir()')

2. Prolazni globalni parametar; parametar lokalno stanovništvo je izostavljen

Globalni i lokalni parametri (rječnici) koriste se za globalne i lokalne varijable. Ako je lokalni rječnik izostavljen, zadani je globalni rječnik. Znači, globali će se koristiti i za globalne i za lokalne varijable.

Napomena: Trenutni globalni i lokalni rječnik u Pythonu možete provjeriti pomoću ugrađenih metoda globals () i local ().

Primjer 3: Prosljeđivanje praznog rječnika kao globalnog parametra

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

Izlaz

 ('__builtins__') Traceback (najnoviji zadnji poziv): Datoteka "", red 5, u ispisu (eval ('sqrt (25)', ())) Datoteka "", red 1, u NameError: name 'sqrt' nije definirano

Ako prazan rječnik prenesete kao globalni, __builtins__dostupni su samo expression(prvi parametar eval()).

Iako smo mathmodul uvezli u gornji program, izraz ne može pristupiti nijednoj funkciji koju pruža matematički modul.

Primjer 4: Dostupnost određenih metoda

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

Izlaz

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

Ovdje se izraz može koristiti jedino sqrt()i na pow()metode uz __builtins__.

Također je moguće promijeniti naziv metode dostupne za izraz prema vašoj želji:

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

Izlaz

 ('__builtins__', 'snaga', 'kvadratni_korijen') 3.0

U gornjem programu square_root()izračunava kvadratni korijen pomoću sqrt(). Međutim, pokušaj sqrt()izravne upotrebe potaknut će pogrešku.

Primjer 5: Ograničavanje upotrebe ugrađenih datoteka

Upotrebu __builtins__u izrazu možete ograničiti na sljedeći način:

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

3. Usvajanje rječnika za globale i lokalno stanovništvo

Potrebne funkcije i varijable možete učiniti dostupnim za upotrebu dodavanjem rječnika lokalnog stanovništva. Na primjer:

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

Izlaz

 13,0

U ovom programu izraz može imati samo sqrt()metodu i varijablu a. Sve ostale metode i varijable nisu dostupne.

Ograničenje upotrebe eval()prosljeđivanja globalnih i lokalnih rječnika učinit će vaš kod sigurnim, posebno kada koristite unos koji je za eval()metodu dao korisnik .

Napomena: Ponekad eval()nije sigurno ni s ograničenim imenima. Kad se objekt i njegove metode učine dostupnim, može se učiniti gotovo sve. Jedini siguran način je provjera valjanosti korisničkog unosa.

Zanimljivi članci...