Python eval ()

Metode eval () parsē šai metodei nodoto izteiksmi un programmas ietvaros palaiž pitona izteiksmi (kodu).

Vienkārši sakot, eval()funkcija palaiž pitona kodu (kas tiek nodots kā arguments) programmā.

Sintakse eval()ir:

 eval (izteiksme, globāļi = nav, vietējie = nav)

eval () parametri

eval()Funkcija ir trīs parametri:

  • izteiksme - virkne parsēta un novērtēta kā Python izteiksme
  • globāls (pēc izvēles) - vārdnīca
  • vietējie (pēc izvēles) - kartēšanas objekts. Vārdnīca ir standarta un parasti izmantots kartēšanas veids Python.

Globālo un vietējo iedzīvotāju izmantošana tiks aplūkota vēlāk šajā rakstā.

Atgriezeniskā vērtība no eval ()

Metode eval () atgriež rezultātu, kas novērtēts no izteiksmes.

1. piemērs: Kā darbojas eval () Python

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

Rezultāts

 2

Šeit eval()funkcija novērtē izteiksmi x + 1un printtiek izmantota šīs vērtības parādīšanai.

2. piemērs: praktisks piemērs, lai parādītu eval () izmantošanu

 # 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

Rezultāts

 Ierakstiet funkciju: aprēķiniet laukumu (l) Ja garums ir 1, Platība = 1 Ja garums ir 2, Platība = 4 Ja garums ir 3, Platība = 9 Ja garums ir 4, Platība = 16

Brīdinājumi, lietojot eval ()

Apsveriet situāciju, kad izmantojat Unix sistēmu (macOS, Linux utt.) Un esat importējis osmoduli. OS modulis nodrošina pārnēsājamu veidu, kā izmantot operētājsistēmas funkcijas, piemēram, lasīšanu vai rakstīšanu failā.

Ja jums ļauj lietotājiem ievadīt vērtību, izmantojot eval(input()), lietotājs var izdot komandas, lai mainītu failu vai pat izdzēst visus failus, izmantojot komandu: os.system('rm -rf *').

Ja izmantojat eval(input())kodu, ieteicams pārbaudīt, kādus mainīgos un metodes lietotājs var izmantot. Izmantojot dir () metodi, jūs varat redzēt, kuri mainīgie un metodes ir pieejami.

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

Rezultāts

('__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', ' asinh ',' atan ',' atan2 ',' atanh ',' griesti ',' ķemme ',' kopiju dizains ',' cos ',' cosh ',' grādi ',' dist ',' e ',' erf ' , 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hipot', ' inf ',' isclose ',' isfinite ',' isinf ',' isnan ',' isqrt ',' ldexp ',' lgamma ',' log ',' log10 ',' log1p ','log2 ',' modf ',' nan ',' os ',' perm ',' pi ',' pow ',' prod ',' radians ',' atlikums ',' grēks ',' sinh ',' sqrt ' , 'tan', 'tanh', 'tau', 'trunc')

Pieejamo metožu un mainīgo izmantošanas ierobežošana eval ()

Bieži vien visas izteiksmē (pirmais parametrs līdz eval()) izmantotās pieejamās metodes un mainīgie var nebūt vajadzīgi vai pat var būt ar drošības caurumu. Jums var būt jāierobežo šo metožu un mainīgo izmantošana eval(). To var izdarīt, nododot funkcijai izvēles globālos un lokālos parametrus (vārdnīcas) eval().

1. Kad tiek izlaisti gan globālie, gan vietējie parametri

Ja abi parametri tiek izlaisti (tāpat kā mūsu iepriekšējos piemēros), izteiksme tiek izpildīta pašreizējā darbības jomā. Pieejamos mainīgos un metodes varat pārbaudīt, izmantojot šādu kodu:

 print(eval('dir()')

2. Globālā parametra nodošana; vietējo parametrs nav norādīts

Globālajiem un lokālajiem parametriem (vārdnīcām) tiek izmantoti attiecīgi globālie un lokālie mainīgie. Ja vietējo vārdnīca ir izlaista, tā pēc noklusējuma ir globālā vārdnīca. Nozīme, globālie tiks izmantoti gan globālajiem, gan lokālajiem mainīgajiem.

Piezīme. Pašreizējo globālo un lokālo vārdnīcu Python varat pārbaudīt, izmantojot attiecīgi globals () un localals () iebūvētās metodes.

3. piemērs: Tukšās vārdnīcas kā globālā parametra nodošana

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

Rezultāts

 ('__builtins__') Traceback (pēdējais zvans pēdējais): Fails "", 5. rinda, drukātā veidā (eval ('sqrt (25)', ())) File "", 1. rindiņa, NameError: nosaukums 'sqrt' nav definēts

Ja jūs nododat tukšu vārdnīcu kā globālo, __builtins__ir pieejamas tikai tās expression(pirmais parametrs eval()).

Lai gan mēs esam importējuši mathmoduli iepriekš minētajā programmā, izteiksme nevar piekļūt nevienai matemātikas moduļa nodrošinātai funkcijai.

4. piemērs: Dažu metožu pieejamība

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

Rezultāts

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

Šeit izteiksmē var izmantot tikai sqrt()un pow()metodes kopā ar __builtins__.

Tāpat ir iespējams mainīt izteicienam pieejamās metodes nosaukumu pēc jūsu vēlmes:

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

Rezultāts

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

Iepriekš minētajā programmā square_root()aprēķina kvadrātsakni, izmantojot sqrt(). Tomēr mēģinājums izmantot sqrt()tieši radīs kļūdu.

5. piemērs: iebūvēto ierīču izmantošanas ierobežošana

Varat ierobežot __builtins__izteiksmes lietošanu šādi:

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

3. Gan globālās, gan vietējās vārdnīcas nodošana

Nepieciešamās funkcijas un mainīgos varat padarīt pieejamus, nododot vietējo vārdnīcu. Piemēram:

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

Rezultāts

 13.0

Šajā programmā izteiksmei var būt tikai sqrt()metode un mainīgais a. Visas citas metodes un mainīgie nav pieejami.

Ierobežojot to, eval()ka garām iet globālās un vietējās vārdnīcas, kods būs drošs, it īpaši, ja izmantojat lietotāja ievadīto eval()metodi.

Piezīme. Dažreiz eval()tas nav drošs pat ar ierobežotiem nosaukumiem. Kad objekts un tā metodes ir pieejamas, var izdarīt gandrīz visu. Vienīgais drošais veids ir validēt lietotāja ievadi.

Interesanti raksti...